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

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

1
มีเหตุผลใดที่จะใช้ดัชนีสำหรับตารางที่เล็กมาก (มากถึง 1,000 แถว)?
ในระหว่างการพัฒนาแอพพลิเคชั่นฉันมีตารางจำนวนมากที่เก็บข้อมูล "เล็ก" จำนวนมาก (โดยปกติแล้วจะมีค่า 10-40 ค่าid+ valueและบางครั้งtype) ซึ่งเก็บแอตทริบิวต์สำหรับ "วัตถุ" เช่นสด / เน่าแดง / เขียว / น้ำเงินสำหรับผลิตภัณฑ์ ฉันไม่ได้ใส่คุณสมบัตินี้ไว้ในตารางผลิตภัณฑ์เนื่องจากส่วนประกอบอิเล็กทรอนิกส์ไม่สามารถสดใหม่และก๊าซออกซิเจนไม่สามารถเป็นสีแดงและตารางไม่สามารถนับแถวได้ไม่ จำกัด ... สำหรับการจัดเก็บคุณสมบัติฉันใช้ตารางขนาดเล็กที่กำหนดเองที่ฟิลด์ 2-3: idสำหรับการเชื่อมโยงnameเพื่อแสดงในแอปพลิเคชันและบางครั้งtypeถ้ากลุ่มคุณลักษณะในประเภทเดียวกัน "ออบเจ็กต์" หลักเชื่อมโยงกับแอตทริบิวต์ผ่านตารางหลายต่อหลายกลาง มีเหตุผลในการสร้างและรักษาดัชนีสำหรับ "พจนานุกรมขนาดเล็ก" เหล่านั้นที่มีน้อยกว่า 1,000 รายการ (ปกติคือ 10-40) หรือไม่ ฐานข้อมูลเป้าหมายของฉันคือ Oracle แต่ฉันหวังว่าจะตอบผู้ขายอิสระ ... ฉันเติม - ไม่ แต่ไม่มีทักษะทางเทคนิคในการปรับความเหมาะสมของฉัน ...

3
SQL Server Sandbox
ฉันกำลังพยายามตั้งค่า sandbox สำหรับผู้พัฒนารายงานของเราเพื่อทำงานในแผนปัจจุบันของฉันคือ "รีเซ็ต" ฐานข้อมูลทุกเย็น แต่ฉันไม่แน่ใจว่าจะทำอย่างไร สิ่งที่ฉันหมายถึงโดยการตั้งค่าใหม่คือฉันต้องการวางตารางผู้ใช้มุมมองกระบวนงานที่เก็บไว้และอื่น ๆ จากทั้งหมดยกเว้นฐานข้อมูลเดียวบนเซิร์ฟเวอร์ ฉันคิดว่าอีกทางเลือกหนึ่งคือการปล่อยและสร้างฐานข้อมูลอีกครั้ง แต่ฉันค่อนข้างแน่ใจว่านั่นหมายถึงการเข้าถึงกลุ่มโฆษณา / คนที่เหมาะสมทั้งหมดอีกครั้ง ฉันไม่รู้จริงๆว่าอะไรจะเป็นวิธีที่ดีที่สุดในการทำสิ่งนี้ดังนั้นฉันหวังว่าพวกคุณบางคนจะสามารถให้ความคิด / คำแนะนำที่ดีได้ ขอบคุณ เพื่อความชัดเจนเราเป็นหลักต้องการที่จะทำเช่นนี้กับฐานข้อมูลของเรา: http://try.discourse.org/t/this-site-is-a-sandbox-it-is-reset-every-day/57 ความแตกต่างเพียงอย่างเดียวคือเราไม่ต้องการสร้างผู้ใช้ของเราใหม่ทุกวัน รุ่น: SQL Server 2008 Edition: ผู้พัฒนาและองค์กร

2
เปลี่ยนการดักจับข้อมูลและไบนารี __ $ update_mask
เรากำลังใช้ CDC เพื่อบันทึกการเปลี่ยนแปลงที่เกิดขึ้นกับตารางการผลิต แถวที่เปลี่ยนแปลงกำลังถูกส่งออกไปยังคลังข้อมูล (informatica) ฉันรู้ว่าคอลัมน์ __ $ update_mask เก็บคอลัมน์ใดที่ได้รับการปรับปรุงในรูปแบบ varbinary ฉันยังรู้ว่าฉันสามารถใช้ฟังก์ชั่น CDC ที่หลากหลายเพื่อค้นหาจากหน้ากากที่คอลัมน์เหล่านั้น คำถามของฉันคือสิ่งนี้ ใครสามารถนิยามตรรกะเบื้องหลังหน้ากากนั้นให้ฉันเพื่อให้เราสามารถระบุคอลัมน์ที่เปลี่ยนแปลงไปในคลังสินค้าได้หรือไม่? เนื่องจากเรากำลังประมวลผลนอกเซิร์ฟเวอร์เราจึงไม่สามารถเข้าถึงฟังก์ชั่น MSSQL CDC เหล่านั้นได้อย่างง่ายดาย ฉันค่อนข้างจะพังหน้ากากตัวเองในรหัส ประสิทธิภาพของฟังก์ชั่น cdc ใน SQL end นั้นเป็นปัญหาสำหรับวิธีนี้ กล่าวโดยย่อฉันต้องการระบุคอลัมน์ที่มีการเปลี่ยนแปลงด้วยมือจากฟิลด์ __ $ update_mask ปรับปรุง: ในฐานะที่เป็นทางเลือกที่ส่งรายชื่อคอลัมน์ที่เปลี่ยนแปลงไปยังคลังสินค้าที่มนุษย์สามารถอ่านได้ เราพบว่าสิ่งนี้สามารถทำได้ด้วยประสิทธิภาพที่สูงกว่าวิธีดั้งเดิมของเรา คำตอบ CLR สำหรับคำถามนี้ตรงกับทางเลือกนี้และรวมถึงรายละเอียดของการตีความหน้ากากสำหรับผู้เข้าชมในอนาคต อย่างไรก็ตามคำตอบที่ยอมรับได้โดยใช้ XML PATH นั้นเร็วที่สุดสำหรับผลลัพธ์สุดท้ายเดียวกัน

2
การเพิ่มผู้ใช้ไปยัง MySQL ด้วย 'name' @ '%' ล้มเหลวด้วย ERROR 1396
ฉันแค่พยายามเพิ่มผู้ใช้ใหม่ไปยัง MySQL โดยใช้ CREATE USER 'name'@'%' IDENTIFIED BY '...' อย่างไรก็ตามมันล้มเหลวด้วยข้อผิดพลาดต่อไปนี้: ERROR 1396 (HY000): Operation CREATE USER failed for 'name'@'%' การเพิ่มผู้ใช้สำหรับ localhost นั้นทำได้ดี: CREATE USER 'name'@'localhost' IDENTIFIED BY '...' ฉันไม่มีเงื่อนงำสิ่งที่อาจเป็นปัญหาได้ ฉันจะขอบคุณสำหรับความคิดใด ๆ (ฉันใช้mysql Ver 14.14 Distrib 5.1.66อยู่)

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

1
ระบุเหตุการณ์การเติบโตของไฟล์
ฉันค้นพบฐานข้อมูลจำนวนมากในแฟ้มสะสมผลงานของฉันที่สร้างขึ้นด้วยการตั้งค่า autogrow เริ่มต้น (เพิ่มขึ้น 1 MB หรือ 10%) ที่ขยายเป็นระยะเวลานาน หากฉันต้องการทราบจำนวนของการแตกแฟรกเมนต์ภายนอกสำหรับไฟล์ DB แต่ละไฟล์ฉันสามารถรับข้อมูลเมตาได้กี่ครั้งที่ไฟล์ DB ได้รับการแก้ไขในขนาด (โดย autogrow หรือด้วยตนเอง)? เพื่อชี้แจงฉันจะได้รับจาก metadata ประวัติของการแก้ไขไฟล์ DB สำหรับอายุการใช้งานของ DB ไม่ใช่แค่ตั้งแต่การรีสตาร์ทอินสแตนซ์?

1
การออกแบบโครงสร้างอย่างง่ายสำหรับการแยกแยะการพยากรณ์อุปสงค์
ฉันกำลังทำงานออกแบบฐานข้อมูลอย่างง่ายเป็นแบบฝึกหัดการฝึกอบรมซึ่งฉันต้องออกแบบโครงสร้างพื้นฐานสำหรับกรณีต่อไปนี้: ฉันมีลำดับชั้นของผลิตภัณฑ์หลัก (ตัวอย่างเช่นวัตถุดิบ> งานระหว่างทำ> ผลิตภัณฑ์สุดท้าย) คำสั่งซื้อจะถูกวางไว้ในแต่ละระดับ จำนวนการสั่งซื้อจะสามารถดูได้ในที่เก็บข้อมูลรายสัปดาห์ในอีก 6 เดือนข้างหน้า การคาดการณ์ความต้องการสามารถทำได้สำหรับแต่ละระดับผลิตภัณฑ์ การพยากรณ์อุปสงค์สำหรับสัปดาห์ใด ๆ ภายใน 6 เดือนข้างหน้าสามารถทำได้ในวันนี้ การพยากรณ์ความต้องการใช้สำหรับถังข้อมูลรายสัปดาห์ในอีก 6 เดือนข้างหน้า การพยากรณ์ความต้องการมักจะทำในระดับที่สูงขึ้นในลำดับชั้น (วัตถุดิบหรืองานในระดับความคืบหน้า) จะต้องมีการแยกออกเป็นระดับที่ต่ำกว่า (ผลิตภัณฑ์สุดท้าย) มี 2 ​​วิธีที่การพยากรณ์ความต้องการสามารถแยกจากระดับที่สูงขึ้นไปถึงระดับที่ต่ำกว่าได้: ผู้ใช้ระบุเปอร์เซ็นต์การกระจายสำหรับผลิตภัณฑ์สุดท้าย สมมติว่ามีการคาดการณ์ 1,000 รายการสำหรับความคืบหน้าในการทำงาน .. และผู้ใช้บอกว่าฉันต้องการ 40% สำหรับผลิตภัณฑ์ขั้นสุดท้าย 1 และ 60% สำหรับผลิตภัณฑ์ขั้นตอนที่ 2 ในที่เก็บข้อมูล 10 .. จากนั้นสำหรับสัปดาห์ที่ 10 (วันอาทิตย์ถึงวันเสาร์) นับจากนี้ สำหรับผลิตภัณฑ์สุดท้าย 1 จะเป็น 400 และสำหรับผลิตภัณฑ์สุดท้าย …

1
การถ่ายโอนข้อมูลของตาราง mysql ในการนำเข้าแทนที่ระเบียนที่มีอยู่
ฉันถ่ายโอนข้อมูลโดยใช้ mysqldump .. mysqldump -u... -p... mydb t1 > mydb_table.sql จากนั้นฉันก็นำเข้าดัมพ์ในฐานข้อมูลอื่นที่มีตารางเดียวกัน แต่บันทึกต่างกัน .. mysql -u...-p... mydb < mydb_tables.sql การอิมพอร์ต db มีเร็กคอร์ดจาก primary_key 1 ถึง 1,000 และการเอ็กซ์พอร์ต db มี 5,000 ถึง 10,000 .. แต่เมื่อนำเข้าระเบียนที่มีอยู่เช่น 1 ถึง 1,000 ถูกลบ .. วิธี ?? ทำไม?? ถ้ามันเป็นพฤติกรรมเริ่มต้นตัวเลือกอะไรที่ฉันสามารถให้กับการถ่ายโอนข้อมูลเพื่อไม่ให้มันเกิดขึ้นในครั้งต่อไป ..

2
วิธีที่ดีที่สุดในการจัดเรียงข้อมูล / กระชับฐานข้อมูลเพื่อวัตถุประสงค์ในการเก็บถาวร
เรามีอินสแตนซ์ของ SQL Server ที่ใช้สำหรับการเก็บถาวรอีเมล (ได้รับความอนุเคราะห์จากแพ็คเกจการเก็บถาวรของบุคคลที่สาม) บ่อยครั้งซอฟต์แวร์จะถูกนำไปวางในฐานข้อมูลเปล่าใหม่ เราเคยทำมาทุกไตรมาสในอดีต แต่เราต้องการทำรายเดือนในตอนนี้ จำนวนข้อมูลที่ถูกเก็บถาวรอยู่ที่ประมาณ 15 - 20 GB ต่อเดือนและข้อมูลจำนวนมากอยู่ในตารางเพียงไม่กี่ตาราง (โดยปกติคือ 2 - 4) เมื่อเราหมุนไปยังฐานข้อมูลใหม่แล้วฐานข้อมูลเก่าจะถูกใช้บนพื้นฐานแบบอ่านอย่างเดียว สิ่งที่ฉันต้องการจะทำคือปรับให้เป็นไฟล์ข้อมูลที่ดีและแน่นหนาโดยมีตาราง / ดัชนีทั้งหมดต่อเนื่องกันและมีตัวประกอบการเติมสูงมากและไม่มีพื้นที่ว่างที่ท้ายแฟ้มข้อมูล นอกจากนี้เรากำลังใช้ Standard Edition บนเซิร์ฟเวอร์นี้ด้วยข้อ จำกัด ทั้งหมดที่บอกเป็นนัย (ไม่เช่นนั้นฉันจะใช้การบีบอัดข้อมูลอยู่แล้ว) ความเป็นไปได้บางอย่างที่ฉันสามารถนึกได้: REBUILD / REORGANIZE ดัชนี DBCC SHRINKFILE (โอเคนี่ไม่ใช่ตัวเลือกที่สมเหตุสมผลเนื่องจาก DBCC SHRINKFILE จะแยกส่วนปัสสาวะออกจากสิ่งที่มันสัมผัส แต่ฉันรวมไว้เพื่อความสมบูรณ์) สร้างฐานข้อมูลใหม่โดยอัตโนมัติปิดสถานะ สคริปต์และสร้างตารางทั้งหมดจากฐานข้อมูลต้นฉบับอีกครั้ง ใช้ bcp เพื่อส่งออก / นำเข้าข้อมูลไปยังฐานข้อมูลใหม่ตามลำดับคีย์ - คลัสเตอร์ …

1
วิธีแสดงรายการผู้ใช้ทั้งหมดที่มีสิทธิ์เหนือแพ็คเกจ
ฉันกำลังค้นหาข้อความค้นหาเพื่อแสดงรายการผู้ใช้ทั้งหมดที่มีสิทธิ์เหนือแพ็คเกจ ตัวอย่างเช่นผู้ใช้ Schema_A ได้รับอนุญาตให้ดำเนินการแพ็คเกจ: B.MyPackage ฉันกำลังค้นหามุมมองหรือตารางเช่น: role_tab_privs, role_sys_privs, sys.dba_sys_privs, dba_role_privs ... แต่ฉันไม่พบสิ่งที่ฉันกำลังมองหา

2
RAM ที่เพิ่มขึ้นประสิทธิภาพที่แย่ลง
ติดตั้ง: Windows Server 2008 R2 SQL Server 2008 R2 SP1 RAM 240GB TempDB เป็นไฟล์ข้อมูลขนาด 8x16GB โดยไม่มีการเติบโตอัตโนมัติ (รวม 128GB) เซิร์ฟเวอร์ทางกายภาพ / เซิร์ฟเวอร์แบบเอกเทศ เซิร์ฟเวอร์นี้ใช้สำหรับการประมวลผล ETL เราเพิ่งติดตั้ง RAM เพิ่มเติมในเซิร์ฟเวอร์นี้รวม 240GB RAM บริการ SQL Server เป็นสิ่งเดียวที่ทำงานจริง หน่วยความจำแสดงผลได้ดีใน BIOS, OpenManage และ Windows ถ้าฉันกำหนดค่า SQL Server ให้ใช้หน่วยความจำต่ำสุด / สูงสุด 70 / 100GB เราก็ไม่มีปัญหา อย่างไรก็ตามเมื่อฉันเพิ่มเป็น 120/150GB ฉันได้รับข้อผิดพลาดต่อไปนี้เมื่อฉันเรียกใช้กระบวนการ …

5
กรองชุดใหญ่อย่างมีประสิทธิภาพด้วยการแยก
สมมติว่าฉันมีตารางเดียว CREATE TABLE Ticket ( TicketId int NOT NULL, InsertDateTime datetime NOT NULL, SiteId int NOT NULL, StatusId tinyint NOT NULL, AssignedId int NULL, ReportedById int NOT NULL, CategoryId int NULL ); ในตัวอย่างนี้TicketIdคือคีย์หลัก ฉันต้องการให้ผู้ใช้งานสามารถสร้างข้อความค้นหา "เฉพาะกิจบางส่วน" ได้จากตารางนี้ ฉันพูดบางส่วนเพราะบางส่วนของแบบสอบถามจะได้รับการแก้ไขเสมอ: แบบสอบถามจะเสมอทำการกรองช่วงบน InsertDateTime แบบสอบถามจะเสมอ ORDER BY InsertDateTime DESC แบบสอบถามจะหน้าผลลัพธ์ ผู้ใช้สามารถเลือกที่จะกรองคอลัมน์อื่นใดก็ได้ พวกเขาสามารถกรองไม่มีใครคนหนึ่งหรือหลายคน และสำหรับแต่ละคอลัมน์ผู้ใช้อาจเลือกจากชุดของค่าที่จะนำไปใช้เป็นความแตกแยก ตัวอย่างเช่น: SELECT …

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

2
การทำธุรกรรมและลองจับในงาน SQL Server
เรามีการดำเนินงาน DML ในแต่ละขั้นตอนของงาน SQL Server เพื่อให้แน่ใจว่าการปรับปรุง / แทรกจะถูกรีดกลับในกรณีอะไรผิดพลาดผมได้ห่อการปรับเปลี่ยนข้อมูลของแต่ละขั้นตอนในTRY CATCHและTRANSACTIONบล็อก: BEGIN TRY BEGIN TRANSACTION [[INSERT/update statements]] ... IF @@TRANCOUNT > 0 BEGIN COMMIT TRANSACTION PRINT 'Successful.' END END TRY BEGIN CATCH SELECT ERROR_NUMBER() AS ErrorNumber, ERROR_SEVERITY() AS ErrorSeverity, ERROR_STATE() AS ErrorState, ERROR_PROCEDURE() AS ErrorProcedure, ERROR_LINE() AS ErrorLine, ERROR_MESSAGE() AS ErrorMessage IF …

4
ย้ายแถวจากตารางหนึ่งไปอีกตารางหนึ่ง
ฉันกำลังย้ายระเบียนจากฐานข้อมูลหนึ่งไปยังอีกฐานข้อมูลซึ่งเป็นส่วนหนึ่งของกระบวนการเก็บถาวร ฉันต้องการคัดลอกแถวไปยังตารางปลายทางแล้วลบแถวเดียวกันออกจากตารางต้นฉบับ คำถามของฉันคือวิธีที่มีประสิทธิภาพที่สุดในการตรวจสอบว่าการแทรกครั้งแรกสำเร็จหรือไม่ก่อนที่จะลบแถว ความคิดของฉันคือสิ่งนี้ แต่ฉันรู้สึกว่ามีวิธีที่ดีกว่า: @num_records=select count(ID) from Source_Table where (criteria for eligible rows) insert * into Destination_Table where (criteria for eligible rows) if ((select count(ID) from Destination_Table where (criteria) )=@numrecords) delete * from Source_Table where (criteria) จะดีกว่า / เป็นไปได้ที่จะรวมเข้ากับฟังก์ชั่น RAISERROR หรือไม่? ขอบคุณ!

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