ผู้ดูแลฐานข้อมูล

ถามตอบสำหรับผู้เชี่ยวชาญด้านฐานข้อมูลที่ต้องการพัฒนาทักษะฐานข้อมูลและเรียนรู้จากผู้อื่นในชุมชน

3
การออกแบบคลังข้อมูล: มิติเวลาวันที่แบบรวมเทียบกับมิติและวันและเวลาที่แยกจากกัน
เราเพิ่งเริ่มออกแบบคลังข้อมูลใหม่และเราพยายามออกแบบวิธีการทำงานของวันที่และเวลา เราต้องสามารถรองรับหลายเขตเวลา (อาจอย่างน้อย GMT, IST, PST และ EST) ตอนแรกเราคิดว่าเราจะมีมิติเวลาวันที่ที่รวมกันกว้างลงไปจนถึง 15 นาทีอย่างละเอียดด้วยวิธีนี้เรามีหนึ่งคีย์ในตารางข้อเท็จจริงของเราและข้อมูลวันที่ที่แตกต่างกันทั้งหมดสำหรับเขตเวลาที่สนับสนุนทั้งหมดอยู่ในตารางมิติหนึ่ง (เช่นรหัสวันที่, วันที่ GMT, เวลา GMT, วันที่ IST, เวลา IST, ฯลฯ ... ) Kimball แนะนำให้มีการแยกมิติวันจากช่วงเวลาของวันเพื่อป้องกันไม่ให้ตารางขยายตัวใหญ่เกินไป (ชุดเครื่องมือคลังข้อมูลหน้า 240) ซึ่งฟังดูดี แต่นั่นหมายความว่าเรามีสองปุ่มในตารางความเป็นจริงสำหรับแต่ละเขตเวลา เราต้องการการสนับสนุน (หนึ่งสำหรับวันที่และหนึ่งสำหรับช่วงเวลาของวัน) เนื่องจากฉันไม่มีประสบการณ์มากในพื้นที่นี้ฉันหวังว่าจะมีใครบางคนรู้ว่าการแลกเปลี่ยนระหว่างสองวิธีคือประสิทธิภาพและการจัดการของคีย์โซนเวลาที่แตกต่างกันทั้งหมด อาจมีวิธีอื่นด้วยเช่นกันฉันเคยเห็นบางคนกำลังพูดถึงการแยกแถวในตารางความเป็นจริงต่อเขตเวลา แต่ดูเหมือนว่าจะมีปัญหาหากคุณข้อเท็จจริงว่าตารางมีจำนวนหลายล้านแถวคุณต้องเพิ่มสี่เท่าเพื่อเพิ่มเขตเวลา . ถ้าเราทำธัญพืช 15 นาทีเราจะมีแถว 131,400 (24 * 15 * 365) ต่อปีในตารางมิติเวลาวันที่ซึ่งไม่ฟังดูน่าเกลียดเกินไปสำหรับการแสดง แต่เราไม่รู้แน่ชัดจนกระทั่งเราทดสอบบางอย่าง แบบสอบถามต้นแบบ ข้อกังวลอื่น ๆ เกี่ยวกับการมีคีย์โซนเวลาแยกต่างหากในตารางข้อเท็จจริงคือแบบสอบถามต้องเข้าร่วมตารางมิติกับคอลัมน์อื่นตามเขตเวลาที่ต้องการบางทีนี่อาจเป็นสิ่งที่ …

4
การแบ่งพาร์ติชันเซิร์ฟเวอร์ SQL - สิ่งที่ต้องใช้สำหรับพาร์ติชันคีย์?
ฉันไม่เคยทำงานกับการแบ่งพาร์ติชันของเซิร์ฟเวอร์ SQL แต่ขณะนี้ฉันต้องเผชิญกับการออกแบบฐานข้อมูลซึ่งอาจรับประกันไดรฟ์ ระบบนี้ใช้สำหรับคูปอง คูปองจะออกเป็นระยะโดยปกติทุก ๆ หกสัปดาห์แม้ว่าจะมีการออกโฆษณาแบบเฉพาะกิจเช่นสำหรับกิจกรรมพิเศษ มีลูกค้า 15 ล้านคนและสำหรับการออกแต่ละครั้งลูกค้าทุกคนจะได้รับคูปอง 6 ประเภทที่แตกต่างกันโดยมีคูปองรวม 90 ล้านใบ เราจำเป็นต้องติดตามข้อมูลการแลกรับอินสแตนซ์คูปองและเก็บรักษาไว้เป็นเวลา 6 เดือนถึงแม้ว่าโดยทั่วไปแล้วคูปองจะใช้ได้เพียงหกสัปดาห์เท่านั้น คำขอแลกรางวัลใด ๆ สำหรับคูปองที่ไม่ถูกต้องจะไม่สามารถเข้าถึงฐานข้อมูลได้เพราะจะทำการตรวจสอบโดย POS จนถึง ในช่วงเวลาหกเดือนเราจะต้องเก็บแถวได้ 360 ล้านแถวในตารางอินสแตนซ์คูปองและมากถึง 72 ล้านแถว (สมมติว่ามีอัตราการไถ่ถอนสูงสุด 20%) ในตารางแลกซื้อ ฉันรู้สึกว่าตัวเลขเหล่านี้ใหญ่เกินไปสำหรับพาร์ติชันเดียวหรือไม่ คำถามของฉันคืออะไรใช้เป็นคีย์พาร์ติชัน หนึ่งในผู้สมัครที่เห็นได้ชัดคือการออกงานโดยให้พาร์ทิชั่นประมาณ 6 ครั้ง แต่ฉันคิดว่าอาจเป็นไปได้ว่าขนาดพาร์ทิชันที่ใหญ่เกินไปที่จะให้มีประสิทธิภาพสูงสุด? มันจะเป็นไปได้ที่จะแบ่งพาร์ติชันด้วยสองปุ่มเช่นโดยการออกอีเวนต์ + ตัวเลขสุดท้ายของรหัสลูกค้าหรือไม่ ดังนั้นตรรกะจะเป็น: If issuance event = 1 and last digit of customer …

3
การบันทึกทุกการเปลี่ยนแปลงของแถวในฐานข้อมูลนั้นถูกเก็บไว้อย่างไร?
ในโครงการที่ฉันกำลังดำเนินการการเปลี่ยนแปลงแถวในบางตารางของฐานข้อมูลต้องถูกติดตามเพื่อการตรวจสอบเพิ่มเติมหรือย้อนกลับ มันจะต้องง่ายต่อการค้นหาผู้ที่แก้ไขแถวจากที่อยู่ IP และเวลาใดและสามารถกู้คืนเวอร์ชันก่อนหน้าได้ สิ่งที่คล้ายกันนั้นใช้โดย Stack Exchange เมื่อฉันเปลี่ยนคำถามของคนอื่นมันเป็นไปได้ที่จะพบว่าฉันเปลี่ยนมันและย้อนกลับการเปลี่ยนแปลง เทคนิคทั่วไปที่ใช้ในการจัดเก็บการเปลี่ยนแปลงทุกอย่างกับวัตถุในฐานข้อมูลคืออะไรเนื่องจากสคีมาปัจจุบันของฉันมีคุณสมบัติเหมือนกัน (ด้านล่าง) ส่วนใหญ่ที่เป็นแอปทางธุรกิจโดยเฉลี่ย วัตถุที่มีขนาดค่อนข้างเล็ก: อาจจะมีบางnvarchar(1000)ตัวอย่างเช่น แต่ไม่ blobs ใหญ่ของข้อมูลไบนารีหนึ่งนี้ถูกเก็บไว้โดยตรงบนดิสก์และเข้าถึงได้โดยตรงและไม่ผ่าน Microsoft SQL filestream, โหลดฐานข้อมูลค่อนข้างต่ำและฐานข้อมูลทั้งหมดได้รับการจัดการโดยเครื่องเสมือนหนึ่งเครื่องบนเซิร์ฟเวอร์ การเข้าถึงเวอร์ชันก่อนหน้าไม่จำเป็นต้องรวดเร็วเท่ากับการเข้าถึงเวอร์ชันล่าสุด แต่ยังต้องเป็นเวอร์ชันล่าสุดและไม่ช้าเกินไป² <TL-DR> ฉันคิดเกี่ยวกับกรณีต่อไปนี้ แต่ฉันไม่มีประสบการณ์จริงกับสถานการณ์เหล่านั้นดังนั้นฉันจะได้ยินความคิดเห็นของผู้อื่น: เก็บทุกอย่างไว้ในตารางเดียวกันโดยแยกแถวตาม ID และรุ่น IMO มันโง่มากและจะเจ็บไม่ช้าก็เร็วในระดับประสิทธิภาพ ด้วยวิธีนี้มันเป็นไปไม่ได้ที่จะตั้งระดับความปลอดภัยที่แตกต่างกันไปเป็นไอเท็มล่าสุดและการติดตามเวอร์ชั่น ในที่สุดทุกคำถามจะมีความซับซ้อนในการเขียน ที่จริงแล้วในการเข้าถึงข้อมูลที่ทันสมัยฉันจะถูกบังคับให้จัดกลุ่มทุกอย่างด้วยรหัสและดึงข้อมูลในแต่ละกลุ่มเวอร์ชันสุดท้าย เก็บเวอร์ชันล่าสุดไว้ในตารางเดียวและในทุก ๆ การเปลี่ยนแปลงให้คัดลอกเวอร์ชันที่ล้าสมัยไปยังตารางอื่นในสคีมาอื่น ข้อบกพร่องคือทุกครั้งที่เราเก็บทุกค่าแม้ว่ามันจะไม่เปลี่ยนแปลง การตั้งค่าการเปลี่ยนแปลงที่จะnullไม่ได้เป็นวิธีการแก้ปัญหาตั้งแต่ฉันยังต้องติดตามเมื่อค่าที่มีการเปลี่ยนแปลงไปหรือจากnullnull เก็บเวอร์ชันล่าสุดไว้ในตารางเดียวและรายการคุณสมบัติที่เปลี่ยนแปลงด้วยค่าก่อนหน้าในตารางอื่น นี้ดูเหมือนว่ามีสองข้อบกพร่อง: binary(max)หนึ่งที่สำคัญที่สุดคือว่าวิธีเดียวที่จะเรียงลำดับประเภทที่แตกต่างกันของค่าก่อนหน้านี้ในคอลัมน์เดียวกันคือการมี อย่างที่สองคือฉันเชื่อว่ามันจะยากกว่าที่จะใช้โครงสร้างดังกล่าวเมื่อแสดงเวอร์ชันก่อนหน้าแก่ผู้ใช้ ทำสิ่งเดียวกันกับในสองประเด็นก่อนหน้านี้ แต่เก็บรุ่นไว้ในฐานข้อมูลแยกต่างหาก ประสิทธิภาพอาจเป็นเรื่องที่น่าสนใจเพื่อหลีกเลี่ยงการชะลอการเข้าถึงเวอร์ชันล่าสุดโดยให้มีเวอร์ชันก่อนหน้าในฐานข้อมูลเดียวกัน ยังฉันเชื่อว่ามันเป็นการเพิ่มประสิทธิภาพก่อนวัยอันควรและจะต้องทำก็ต่อเมื่อมีหลักฐานที่แสดงว่ารุ่นเก่าและรุ่นล่าสุดในฐานข้อมูลเดียวกันเป็นคอขวด </ TL-DR> ¹ตัวอย่างเช่นจะไม่สามารถจัดเก็บการเปลี่ยนแปลงลงในไฟล์บันทึกได้เนื่องจากจะทำเพื่อบันทึก HTTP …

1
ฉันจะตรวจสอบจำนวนการโทรต่อขั้นตอนการจัดเก็บต่อช่วงเวลาได้อย่างไร
เพื่อที่จะวินิจฉัยปัญหาด้านประสิทธิภาพบางอย่างฉันต้องการทำความเข้าใจเกี่ยวกับจำนวนครั้งที่โพรซีเดอร์บางอย่างถูกเรียกเมื่อเปรียบเทียบกับประสิทธิภาพของระบบ มีวิธีรับจำนวนครั้งที่แต่ละโพรซีเดอร์ถูกเรียกระหว่างช่วงเวลาหนึ่งหรือไม่?

3
วิธีทำการสั่งแบบมีเงื่อนไขสำหรับคอลัมน์สองคอลัมน์ขึ้นไป
ใน MS SQL Server 2005 ฉันกำลังเขียนแบบสอบถามหนึ่งรายการที่มีการเรียงลำดับตามเงื่อนไขและปัญหาของฉันคือฉันไม่รู้ว่าฉันจะเรียงลำดับตามเงื่อนไขได้อย่างไรโดยใช้สองคอลัมน์ ถ้าฉันเขียนโค้ดแบบนี้มันใช้งานได้ปกติ select * from table order by case @pkr when 'kol' then kol when 'nci' then nci end ฉันไม่ทราบวิธีการสั่งซื้อแบบมีเงื่อนไขสำหรับคอลัมน์สองคอลัมน์ขึ้นไป select * from table order by case @pkr when 'KOL-NCI' then kol,nci when 'kol-MPCI' then kol,mpci end มีแนวคิดที่จะสร้าง TSQL แบบไดนามิกและใช้งานsp_executesqlแต่ฉันยังคงมองหาแนวคิดที่ดีกว่าอยู่ใช่ไหม

3
SQLITE: ปัญหาของแท็กและผลิตภัณฑ์
ฉันกำลังค้นหาวิธีในการสร้างแบบสอบถามเพื่อทำสิ่งต่อไปนี้: ลองพิจารณา 3 ตาราง: ผลิตภัณฑ์: รายชื่อผลิตภัณฑ์ แท็ก: รายการของแท็ก tag_ties: ตารางที่ใช้เชื่อมโยงแท็กกับผลิตภัณฑ์ ลองพิจารณาโครงสร้างนี้สำหรับแต่ละตาราง: ผลิตภัณฑ์: id (int, autoincrement) ชื่อ (varchar ชื่อของผลิตภัณฑ์) Tags: id (การสร้างอัตโนมัติภายใน) ป้ายกำกับ (varchar ป้ายกำกับของแท็ก) Tag_ties: id (int, autoincrement) tag_id (int หมายถึง id แท็ก) ref_id (int หมายถึงรหัสผลิตภัณฑ์) สิ่งที่ฉันต้องการ: รับผลิตภัณฑ์ทั้งหมดที่ติดแท็กด้วยแท็ก id 10, 11 และ 12 เช่น แบบสอบถามนี้ไม่ทำงานเนื่องจากจะส่งคืนผลิตภัณฑ์ที่มีแท็กอย่างน้อยหนึ่งรายการ: select p.name as name, p.id …
10 query  sqlite  subquery 

3
จะทดสอบเซิร์ฟเวอร์ SQL ได้อย่างไร? [ปิด]
ปิด. คำถามนี้เป็นคำถามปิดหัวข้อ ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้เป็นหัวข้อสำหรับผู้ดูแลฐานข้อมูล Exchange Exchange ปิดให้บริการใน3 ปีที่ผ่านมา ฉันได้รับมอบหมายให้ทดสอบเซิร์ฟเวอร์ MSSQL และ MySQL Server ของเรา ฉันต้องการทราบว่ามีเครื่องมือหรือสคริปต์ใดบ้างที่ฉันสามารถใช้กับระบบปัจจุบันของเราและระบบใหม่เพื่อเปรียบเทียบประสิทธิภาพได้หรือไม่ ฉันต้องการวัดอ่าน / เขียนข้อมูลลงดิสก์และประสิทธิภาพของโปรเซสเซอร์ สิ่งอื่นใดที่อาจเป็นประโยชน์ก็ยอดเยี่ยมเช่นกัน ขอบคุณ!

2
มิเรอร์ผู้จัดจำหน่าย
มีใครประสบความสำเร็จในการทำมิเรอร์ฐานข้อมูลการแจกจ่ายหรือไม่ เรามีเซิร์ฟเวอร์เฉพาะสำหรับตัวแทนจำหน่าย มันจัดการการจำลองแบบพุชทั้งหมดของเราตั้งแต่การผลิตจนถึงการรายงาน เราต้องการสร้างเซิร์ฟเวอร์ที่เหมือนกันปิดในกรณีที่ผู้จัดจำหน่ายล่ม มีใครประสบความสำเร็จในการสร้างบางอย่างเช่นนี้หรือไม่?

1
ฉันจะรู้ได้อย่างไรว่ามีการใช้แหล่งข้อมูลใดใน SSRS
เรามีรายงาน SSRS (2008) มากมายที่ปรับใช้กับเว็บพอร์ทัลของเรา เราได้แก้ไขรายงานบางส่วนเพื่อใช้แหล่งข้อมูลที่ใช้ร่วมกันแตกต่างจากรายงานที่มีการปรับใช้ตั้งแต่แรก ฉันกำลังมองหาวิธีในการสืบค้นฐานข้อมูล ReportServer เพื่อแสดงให้ฉันเห็นว่ารายงานใดที่ใช้แหล่งข้อมูลที่แชร์เหล่านี้ ฉันพบว่าคุณสามารถใช้ข้อมูล XML ที่เก็บไว้ใน Catalog.Content เพื่อแสดงว่ามีการใช้แหล่งข้อมูลใด แต่ปรากฏว่าเป็นแหล่งข้อมูลที่มีการปรับใช้รายงานในขั้นต้น
10 sql-server  ssrs 

2
คอมโพเนนต์สคริปต์ SSIS - วิธีแก้ไข Output0Buffer
ฉันเป็นองค์ประกอบของสคริปต์ที่รับบันทึกจากตารางฐานข้อมูล SQL Azure จากนั้นสคริปต์จะเรียกใช้บริการทางเว็บซึ่งจะส่งกลับจำนวนระเบียนที่ล้มเหลวและสำเร็จ สำหรับบันทึกทั้งหมดฉันต้องการเพิ่มฟิลด์สถานะที่มี "ความสำเร็จ" หรือ "ล้มเหลว" และนี่จะได้รับผลลัพธ์จากองค์ประกอบสคริปต์ ฉันแล้วบันทึกผลลัพธ์เหล่านั้นลงในไฟล์ข้อความ ปัญหา: ฉันไม่สามารถเพิ่มสถานะสำหรับแต่ละเรคคอร์ดอินพุทเนื่องจากการให้บริการผ่านเว็บจะเกิดขึ้นเมื่อโพสต์รันแล้วเท่านั้น ฉันลองสิ่งนี้ แต่ก็ยังใช้งานไม่ได้: public override void Input0_ProcessInputRow(Input0Buffer Row) { listOfData.Add(new ClockData { TimeClockID=Row.TimeClockID, PersonID=Row.EmployeeCode, LocationCode=Row.ClockInServiceContextID, ClockInDateTime=Row.ClockInDateTime, ClockOutDateTime=Row.ClockOutDateTime }); } public override void CreateNewOutputRows() { MessageBox.Show("Test CreateNewOutputRows"); MessageBox.Show(listOfData.Count.ToString()); foreach (var item in listOfData) { Output0Buffer.AddRow(); Output0Buffer.EmployeeCode = item.PersonID; MessageBox.Show(item.PersonID); } …
10 sql-server  ssis 

2
ฉันจะล้างตารางจากแคชของ SQL Server ได้อย่างไร
ฉันมีตารางไม่กี่ตารางในฐานข้อมูลของฉันที่ไม่ควรแคช ฉันจะบอก SQL Server ไม่ให้แคชเพจของตารางหรือฉันจะล้างตารางเดียวจากแคชได้อย่างไร การล้างแคชทั้งหมดไม่ใช่ตัวเลือก ฉันใช้ SQL Server 2008 และ SQL Server 2008 R2


2
ความแตกต่างระหว่างระดับแถวและการล็อกระดับหน้าและผลที่ตามมา
เมื่อพยายามเรียกใช้แผนการบำรุงรักษาของฉันฉันได้รับข้อผิดพลาดต่อไปนี้: การดำเนินการค้นหา "" ล้มเหลวโดยมีข้อผิดพลาดต่อไปนี้: "ดัชนี" "(พาร์ติชัน 1) บนตาราง" "ไม่สามารถจัดระเบียบใหม่ได้เนื่องจากการล็อกระดับหน้าถูกปิดใช้งาน" ขณะนี้เราเปิดใช้งานการล็อกแถวระดับบนดัชนีนี้ ฉันสามารถเปิดใช้งานการล็อกระดับหน้าได้ แต่ไม่แน่ใจว่าผลสะท้อนกลับคืออะไร คำถามของฉันคืออะไร:อะไรคือความแตกต่างระหว่างสองรูปแบบการล็อกและอะไรคือผลที่เกิดขึ้นจริงในโลกของพวกเขา (ในการผลิต)?

4
การพิจารณาประสิทธิภาพระหว่างการใช้ PK แบบกว้างเทียบกับคีย์สังเคราะห์แบบแยกต่างหากกับ UQ คืออะไร
ฉันมีตารางหลายตารางที่สามารถระบุระเบียนได้โดยไม่ซ้ำกับสาขาธุรกิจที่หลากหลาย ก่อนหน้านี้ฉันใช้ฟิลด์เหล่านี้เป็น PK โดยคำนึงถึงประโยชน์เหล่านี้: เรียบง่าย; ไม่มีฟิลด์ที่ไม่เกี่ยวข้องและมีเพียงหนึ่งดัชนี การทำคลัสเตอร์ช่วยให้สามารถผสานการรวมอย่างรวดเร็วและตัวกรองตามช่วง อย่างไรก็ตามฉันได้ยินกรณีที่ทำเพื่อสร้างIDENTITY INTPK สังเคราะห์และบังคับใช้รหัสธุรกิจด้วยUNIQUEข้อ จำกัดแยกต่างหาก ข้อดีคือการที่ PK แคบทำให้ดัชนีรองมีขนาดเล็กกว่ามาก ถ้าตารางมีไม่มีดัชนีอื่น ๆ กว่า PK ผมไม่เห็นเหตุผลที่จะสนับสนุนแนวทางที่สองใด ๆ แม้ว่าจะอยู่ในตารางขนาดใหญ่ก็อาจดีที่สุดที่จะสรุปว่าดัชนีอาจมีความจำเป็นในอนาคตและดังนั้นจึงชอบ PK สังเคราะห์แคบ . ฉันขาดการพิจารณาใด ๆ หรือไม่? อนึ่งฉันไม่ได้โต้เถียงกับการใช้คีย์สังเคราะห์ในคลังข้อมูลฉันแค่สนใจว่าจะใช้ PK แบบกว้าง ๆ เพียงครั้งเดียวและเมื่อใดที่จะใช้ PK แบบแคบและอังกฤษแบบกว้าง

2
DTA แนะนำให้สร้างสถิติ
ฉันเพิ่งรัน T-SQL เคียวรีผ่าน DTA และหนึ่งในคำแนะนำคือการสร้างสถิติบนหนึ่งในคอลัมน์ที่เป็นส่วนหนึ่งของแบบสอบถามจำนวนมากในไฟล์รหัส SQL คำถามของฉันคือสถิติช่วยในเรื่องประสิทธิภาพได้อย่างไร

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.