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

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

20
วิธีการดำน้ำในฐานข้อมูลที่น่าเกลียด?
ฉันแน่ใจว่าคุณหลายคน / กำลังจัดการกับฐานข้อมูลที่น่าเกลียด คุณรู้ไหมว่าฐานข้อมูลที่ไม่ได้เป็นมาตรฐานเลยฐานข้อมูลที่คุณต้องทำแบบสอบถามขนาดใหญ่อย่างเจ็บปวดเพื่อให้ได้ข้อมูลที่น่าสนใจที่สุดฐานข้อมูลที่อยู่ในการผลิตและคุณไม่สามารถเปลี่ยนบิต ... คุณรู้ , "ที่หนึ่ง". คำถามของฉันคือคุณจะจัดการกับมันอย่างไร? คุณพยายามสร้างฐานข้อมูลใหม่หรือไม่? คุณยอมแพ้และปล่อยให้มันอยู่คนเดียว? คุณให้คำแนะนำอะไรได้บ้าง

2
เหตุใดฟังก์ชัน LEN () จึงประเมินค่าความสำคัญต่ำใน SQL Server 2014
ฉันมีตารางที่มีคอลัมน์สตริงและเพรดิเคตที่ตรวจสอบแถวที่มีความยาวแน่นอน ใน SQL Server 2014 ฉันเห็นการประมาณ 1 แถวโดยไม่คำนึงถึงความยาวที่ฉันกำลังตรวจสอบ นี่เป็นแผนที่แย่มากเพราะมีหลายพันหรือหลายล้านแถวและ SQL Server เลือกที่จะวางตารางนี้ไว้ที่ด้านนอกของลูปที่ซ้อนกัน มีคำอธิบายสำหรับการประมาณค่า cardinality ที่ 1.0003 สำหรับ SQL Server 2014 หรือไม่ในขณะที่ SQL Server 2012 ประมาณ 31,622 แถว มีวิธีแก้ปัญหาที่ดีหรือไม่? นี่คือการทำซ้ำสั้น ๆ ของปัญหา: -- Create a table with 1MM rows of dummy data CREATE TABLE #customers (cust_nbr VARCHAR(10) NOT NULL) GO INSERT …

1
Mongodb การสำรองข้อมูลที่เพิ่มขึ้น
ฉันได้รับมอบหมายให้ตั้งค่าการสำรองข้อมูลเพิ่มเติมสำหรับ MongoDB replicaset ซึ่งเป็นจุดเริ่มต้นแน่นอนว่าฉัน googled และไม่พบสิ่งใด ๆ บน MongoDB docs แต่ฉันพบคำถามนี้ใน Stack Overflow ซึ่งสนับสนุนให้พัฒนาโซลูชันของฉันเอง อย่างที่ไม่พบว่า Tayra กระตือรือร้นมาก ฉันอ่านoplogและรู้ว่ามันง่ายมากที่จะพัฒนาสิ่งที่จะเล่นซ้ำบันทึก แต่ปรากฎว่าฉันไม่ต้องmongorestoreทำแบบนั้นสำหรับฉัน ตอนนี้ฉันมีวิธีการทำงานกับสคริปต์ทุบตีและมันค่อนข้างง่ายนั่นคือเหตุผลที่ฉันถามที่นี่หากมีข้อบกพร่องในตรรกะของฉันหรืออาจเป็นสิ่งที่จะกัดฉันในอนาคต ด้านล่างวิธีฉันใช้งาน: ขั้นตอนการสำรองข้อมูลเต็มรูปแบบ ล็อคเขียนในสมาชิกรอง db.fsyncLock() ถ่ายภาพ บันทึกตำแหน่งสุดท้ายจาก oplog db.oplog.rs.find().sort({$natural:-1}).limit(1).next().ts ปลดล็อกการเขียน db.fsyncUnlock() ขั้นตอนการสำรองข้อมูลที่เพิ่มขึ้น ล็อคเขียนในสมาชิกรอง การถ่ายโอนข้อมูล oplog จากตำแหน่ง oplog ที่บันทึกไว้ในการสำรองข้อมูลเต็มรูปแบบ (หรือเพิ่มขึ้นล่าสุด): mongodump --host <secondary> -d local -c oplog.rs -o /mnt/mongo-test_backup/1 --query '{ "ts" …
26 backup  mongodb 

2
ฉันจะจัดทำดัชนี UUID ใน Postgres ได้อย่างไร
ฉันใหม่กับ PostgreSQL และค่อนข้างใหม่สำหรับฐานข้อมูลโดยทั่วไป มีวิธีที่กำหนดไว้ว่าเราควรทำดัชนีค่าUUIDใน Postgres หรือไม่? ฉันแยกระหว่างการใช้การแฮชและการใช้คู่กรณีเว้นแต่ว่ามีบางอย่างในตัวที่ใช้โดยอัตโนมัติ สิ่งที่ฉันใช้คือการจัดการข้อมูลจำนวนมหาศาล ดัชนี "text_ops" ตระกูลโอเปอเรเตอร์ SP-GiST ใช้ trie เนื่องจาก UUID นั้นค่อนข้างยาวและแตกต่างกันมากเสียงเหล่านี้น่าดึงดูดแม้ว่าฉันจะทำการค้นหาแบบเต็มเท่านั้น นอกจากนี้ยังมีตัวเลือกแฮช Hashing คือ O (1) และฉันไม่จำเป็นต้องทำการเปรียบเทียบใด ๆ นอกเหนือจากความเท่าเทียมกันแน่นอน แต่เนื่องจาก UUID ค่อนข้างยาวฉันกลัวว่าการสร้างแฮชจากพวกเขาจะเสียเวลามาก หรือสิ่งนี้ขึ้นอยู่กับระบบมากเกินไปและใช้เฉพาะหรือไม่ ฉันควรใช้bigserialในกรณีส่วนใหญ่ แต่ฉันถูกบอกให้ใช้uuidสำหรับเรื่องนี้ เราต้องการuuidเพราะเราอาจมีเซิร์ฟเวอร์หลายเครื่องที่ใช้ฐานข้อมูลที่แตกต่างกันดังนั้นจึงไม่มีการรับประกันว่าเราจะมี bigint ที่ไม่ซ้ำกัน เราสามารถใช้ลำดับที่แตกต่างกัน (และ seed) สำหรับแต่ละเซิร์ฟเวอร์ แต่ก็ยังไม่ยืดหยุ่นเท่ากับ UUID ตัวอย่างเช่นเราจะไม่สามารถโยกย้ายรายการฐานข้อมูลจากเซิร์ฟเวอร์หนึ่งไปยังเซิร์ฟเวอร์อื่นโดยไม่ต้องแปลง ID และการอ้างอิงของพวกเขาทุกที่
26 postgresql  index  uuid 

4
บันทึกธุรกรรมสำหรับฐานข้อมูล 'database_name' เต็มเนื่องจาก 'XTP_CHECKPOINT'
XTP_CHECKPOINTฉันมีคำถามเกี่ยวกับ ฉันใช้ SQL Server 2014 ฉันมีฐานข้อมูลที่อยู่ในโหมดรูปแบบการกู้คืนที่เรียบง่าย มันยังถูกทำซ้ำ ไม่มีธุรกรรมที่เปิดอยู่ ฉันวิ่งDBCC OPENTRANแล้วมันกลับมา: "ไม่มีธุรกรรมเปิดค้างอยู่" แต่ฉันได้รับข้อความนี้ทุกครั้งที่ฉันพยายามสร้างหรือวางตารางหรือลบข้อมูล: (ฉันได้แทนที่ชื่อฐานข้อมูลจริงด้วยคำว่าdatabase_name) "บันทึกธุรกรรมสำหรับฐานข้อมูล 'database_name' เต็มเนื่องจาก 'XTP_CHECKPOINT'" ไม่มีใครรู้ว่าทำไมสิ่งนี้จึงเกิดขึ้นและที่สำคัญฉันจะทำให้มันหยุดได้อย่างไร และใช่ฐานข้อมูลอยู่ในโหมดการกู้คืนแบบง่าย ie บันทึกธุรกรรมควรตัดโดยอัตโนมัติ บังเอิญฐานข้อมูลอื่นที่ฉันมีในโหมดการกู้คืนเต็มทำสิ่งเดียวกันเริ่มกลับข้อผิดพลาดเดียวกัน: บันทึกธุรกรรมสำหรับฐานข้อมูล 'database_name' เต็มเนื่องจาก 'XTP_CHECKPOINT' ฉันพยายามเปลี่ยนการตั้งค่าการเติบโตบันทึกเป็นการเติบโตแบบไม่ จำกัด แต่จะไม่ให้ฉันกลับข้อผิดพลาดเดียวกัน ฉันสามารถทำซ้ำปัญหาโดยไม่มีสิ่ง XTP ใด ๆ เลยยกเว้นเฉพาะกลุ่มไฟล์ นี่คือวิธี: http://pastebin.com/jWSiEU9U

1
ตรรกะอ่านแตกต่างกันเมื่อเข้าถึงข้อมูล LOB เดียวกัน
นี่คือการทดสอบสามแบบที่อ่านข้อมูลเดียวกัน แต่รายงานการอ่านเชิงตรรกะที่แตกต่างกันมาก: ติดตั้ง สคริปต์ต่อไปนี้สร้างตารางทดสอบที่มี 100 แถวเหมือนกันแต่ละแถวมีคอลัมน์xml ที่มีข้อมูลเพียงพอเพื่อให้แน่ใจว่าจะถูกเก็บไว้นอกแถว ในฐานข้อมูลการทดสอบของฉันความยาวของxml ที่สร้างขึ้นคือ 20,204 ไบต์สำหรับแต่ละแถว -- Conditional drop IF OBJECT_ID(N'dbo.XMLTest', N'U') IS NOT NULL DROP TABLE dbo.XMLTest; GO -- Create test table CREATE TABLE dbo.XMLTest ( ID integer IDENTITY PRIMARY KEY, X xml NULL ); GO -- Add 100 wide xml rows DECLARE @X …

6
จัดทำดัชนีประสิทธิภาพการทำงานเป็นเปิดเมื่อเทียบกับตำแหน่งที่
ฉันมีสองตาราง @T1 TABLE ( Id INT, Date DATETIME ) @T2 TABLE ( Id INT, Date DATETIME ) ตารางเหล่านี้มีดัชนีที่ไม่ทำคลัสเตอร์ (Id, Date) และฉันเข้าร่วมตารางเหล่านี้ SELECT * FROM T1 AS t1 INNER JOIN T2 AS t2 ON t1.Id = t2.Id WHERE t1.Date <= GETDATE() AND t2.Date <= GETDATE() สิ่งนี้สามารถเขียนเป็น SELECT * FROM T1 AS …

3
SQL Server แบ่ง A <> B เป็น A <B หรือ A> B โดยให้ผลลัพธ์ที่แปลกประหลาดหาก B ไม่ได้กำหนดไว้ล่วงหน้า
เราพบปัญหาที่น่าสนใจกับ SQL Server พิจารณาตัวอย่างการทำซ้ำต่อไปนี้: CREATE TABLE #test (s_guid uniqueidentifier PRIMARY KEY); INSERT INTO #test (s_guid) VALUES ('7E28EFF8-A80A-45E4-BFE0-C13989D69618'); SELECT s_guid FROM #test WHERE s_guid = '7E28EFF8-A80A-45E4-BFE0-C13989D69618' AND s_guid &lt;&gt; NEWID(); DROP TABLE #test; ซอ โปรดลืมสักครู่ว่าs_guid &lt;&gt; NEWID()สภาพดูเหมือนจะไร้ประโยชน์โดยสิ้นเชิง - นี่เป็นเพียงตัวอย่างที่ไม่สำคัญ เนื่องจากความน่าจะเป็นของการNEWID()จับคู่ค่าคงที่ที่กำหนดมีค่าน้อยมากจึงควรประเมินเป็น TRUE ทุกครั้ง แต่มันก็ไม่ได้ การเรียกใช้คิวรีนี้มักจะส่งคืน 1 แถว แต่บางครั้ง (ค่อนข้างบ่อยมากกว่า 1 ครั้งจาก 10) …

6
ทำไมเราใช้ Group by 1 และ Group by 1,2,3 ในการสืบค้น SQL?
ในแบบสอบถาม SQL เราจะใช้กลุ่มตามข้อเพื่อใช้ฟังก์ชั่นรวม แต่วัตถุประสงค์เบื้องหลังการใช้ค่าตัวเลขแทนชื่อคอลัมน์กับ Group by clause คืออะไร ตัวอย่างเช่น: จัดกลุ่มตาม 1
26 mysql  plsql  group-by  syntax 

4
การใช้ HAVING ที่ไม่มี GROUP BY ในการสืบค้น SQL
เพื่อที่จะใช้HAVINGในการสืบค้น SQL จะต้องมีการGROUP BYรวมชื่อคอลัมน์หรือไม่ มีกรณีพิเศษที่สามารถใช้งานได้HAVINGโดยไม่ต้องมีGROUP BYแบบสอบถาม SQL หรือไม่? พวกเขาจะต้องอยู่ร่วมกันในเวลาเดียวกันหรือไม่?
26 aggregate 

6
ทำไมคำว่า "สัมพันธ์ (อัล)"?
ในภาษาอังกฤษเราอาจพูดถึงความสัมพันธ์ระหว่างพูดบ๊อบกับทิม บางทีพวกเขาเป็นลูกพี่ลูกน้อง คำว่า "ความสัมพันธ์" ในบริบทนี้สมเหตุสมผลสำหรับฉัน ในบริบทของฐานข้อมูลเชิงสัมพันธ์ฉันเข้าใจว่าคำนี้หมายถึงอะไร แต่ฉันไม่เข้าใจว่าทำไมจึงใช้ ฉันเข้าใจว่าทำไมการใช้งานจึงช่วยให้ฉันเข้าใจสนามได้ดีขึ้นดังนั้นฉันจึงอยากเข้าใจว่าทำไมจึงมีการใช้งาน ยกตัวอย่างเช่นทำไมบุคคลจึงถูกมองว่าเป็น "ความสัมพันธ์"? ในภาษาอังกฤษความสัมพันธ์เป็นคำนามที่อธิบายถึงความสัมพันธ์สองหน่วยงาน มันไม่ได้หมายถึงเอนทิตีเอง ในบริบทของฐานข้อมูลเชิงสัมพันธ์ "ความสัมพันธ์" หมายถึงเอนทิตีเอง ทำไม? ฉันเข้าใจว่าโมเดลเชิงสัมพันธ์เกิดขึ้นหลังจากโมเดลลำดับชั้นและเครือข่าย (เช่นพาเรนต์เพื่อนบ้าน) แต่ในโมเดลเหล่านั้นหน่วยงานยังมีความสัมพันธ์ซึ่งกันและกัน เหตุใดจึงเรียกโมเดลนี้ว่าโมเดลเชิงสัมพันธ์ มีวลี / คำที่เฉพาะเจาะจงมากขึ้นหรือไม่? หรือบางทีเราควรจะบอกว่าทั้งสามรุ่นเป็นแบบจำลองเชิงสัมพันธ์ แต่โมเดลลำดับชั้นและเครือข่ายเป็นแบบจำลองเชิงสัมพันธ์ที่เฉพาะเจาะจง ถ้าเรามีเอนทิตีแบบสแตนด์อโลนที่ไม่เกี่ยวข้องกัน พูดบุคคลประตูและต้นไม้ คำว่า "ความสัมพันธ์ (al)" ยังคงใช้ได้หรือไม่ (บางทีนี่อาจเป็นคำถามหลายข้อฉันคิดว่าคำตอบนั้นมีความเกี่ยวข้องสูง - อาจมีเพียงคำตอบเดียว - ดังนั้นฉันคิดว่ามันสมเหตุสมผลแล้วที่จะเป็นคำถามเดียวถ้าฉันผิดฉันก็แจ้งให้ฉันทราบและฉัน จะสร้างคำถามแยกต่างหากแทน) แก้ไข: แผนภาพนี้อาจเป็นประโยชน์ในการมองเห็นว่าความสัมพันธ์เกี่ยวข้องกับโดเมนที่ต่างกัน:

2
ปัญหาการเพิ่มประสิทธิภาพด้วยฟังก์ชั่นที่ผู้ใช้กำหนด
คำถามนี้ถูกโยกย้ายจาก Stack Overflow เพราะสามารถตอบได้ใน Exchange Administrators Stack Exchange อพยพ 4 ปีที่แล้ว ฉันมีปัญหาในการทำความเข้าใจว่าทำไมเซิร์ฟเวอร์ SQL ตัดสินใจที่จะเรียกใช้ฟังก์ชันที่ผู้ใช้กำหนดสำหรับทุกค่าในตารางแม้ว่าควรดึงข้อมูลได้เพียงหนึ่งแถว SQL จริงมีความซับซ้อนมากขึ้น แต่ฉันสามารถลดปัญหาลงได้ดังนี้ select S.GROUPCODE, H.ORDERCATEGORY from ORDERLINE L join ORDERHDR H on H.ORDERID = L.ORDERID join PRODUCT P on P.PRODUCT = L.PRODUCT cross apply dbo.GetGroupCode (P.FACTORY) S where L.ORDERNUMBER = 'XXX/YYY-123456' and L.RMPHASE = '0' …

4
จะใช้ CDC เพื่อติดตามประวัติเมื่อใด
SQL Server Change Data Capture เป็นคุณสมบัติที่อ่านข้อมูลประวัติจากบันทึกธุรกรรม SQL Server และเก็บไว้ในตารางพิเศษ จากการใช้ฟังก์ชั่นค่าตารางพิเศษ (TVF) จะช่วยให้ผู้ใช้สามารถสืบค้นข้อมูลนี้ทำให้สามารถรับการเปลี่ยนแปลงทั้งหมดในตารางที่ระบุหรือเฉพาะการเปลี่ยนแปลงสุทธิที่เกิดจากการเปลี่ยนแปลงภายในเวลาที่กำหนด CDC มีข้อดีบางประการ มันสามารถกำหนดค่าให้ติดตามเฉพาะตารางหรือคอลัมน์บางอย่าง มันสามารถจัดการกับการเปลี่ยนแปลงของโมเดลในระดับหนึ่งได้ ไม่ส่งผลกระทบต่อประสิทธิภาพเท่า ๆ กับทริกเกอร์เนื่องจากทำงานกับบันทึกธุรกรรม มันเปิด / ปิดการใช้งานได้ง่ายและไม่จำเป็นต้องมีคอลัมน์เพิ่มเติมในตารางที่ควรติดตาม นอกจากนี้ยังมีข้อเสีย: จำนวนข้อมูลประวัติสามารถเป็นไปอย่างรวดเร็วมาก คุณไม่สามารถติดตามผู้ที่ทำการเปลี่ยนแปลงได้ (อย่างน้อยก็ไม่ใช่สำหรับการลบ) ข้อมูลประวัติใช้เวลาพอสมควรในการติดตามเนื่องจากเป็นไปตามบันทึกธุรกรรม ขึ้นอยู่กับ บริษัท ตัวแทนของเซิร์ฟเวอร์ SQL หาก Agent ไม่ทำงานหรือล่มจะไม่มีการติดตามประวัติ ฉันได้อ่านเกี่ยวกับ CDC ค่อนข้างมากและในขณะที่ฉันรู้วิธีใช้งานฉันยังไม่แน่ใจว่ามันเป็นเครื่องมือที่เหมาะสมสำหรับฉันหรือไม่ CDC สำหรับภารกิจ / สถานการณ์ใดเป็นเครื่องมือที่เหมาะสม (เช่นอนุญาตให้ผู้ใช้กู้คืนวัตถุข้อมูลไปยังจุดที่กำหนดเวลาหรือไม่การตรวจสอบ? แสดงประวัติของข้อมูลทั้งหมด?) เมื่อใดที่คุณไม่ควรใช้ CDC แต่หันไปใช้โซลูชันทริกเกอร์ที่กำหนดเอง การใช้ CDC ในฐานข้อมูลการดำเนินงานและใช้ประโยชน์จากข้อมูล CDC …

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

2
วิธีการเขียนแบบสอบถามที่ค้นหาการอ้างอิงแบบวงกลมทั้งหมดเมื่อตารางอ้างอิงตัวเอง?
ฉันมีสคีมาต่อไปนี้ (เปลี่ยนชื่อ) ซึ่งฉันไม่สามารถเปลี่ยนแปลงได้: CREATE TABLE MyTable ( Id INT NOT NULL PRIMARY KEY, ParentId INT NOT NULL ); ALTER TABLE MyTable ADD FOREIGN KEY (ParentId) REFERENCES MyTable(Id); นั่นคือแต่ละระเบียนเป็นลูกของบันทึกอื่น หากเร็กคอร์ดของParentIdเท่ากับIdเร็กคอร์ดนั้นจะถือว่าเป็นโหนดรูท ฉันต้องการเรียกใช้แบบสอบถามซึ่งจะค้นหาการอ้างอิงแบบวงกลมทั้งหมด ตัวอย่างเช่นกับข้อมูล INSERT INTO MyTable (Id, ParentId) VALUES (0, 0), (1, 0), (2, 4), (3, 2), (4, 3); แบบสอบถามควรกลับมา Id | …

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