คำถามติดแท็ก database-internals

สำหรับคำถามทางเทคนิคเกี่ยวกับการทำงานภายในของเอ็นจินฐานข้อมูล

4
จำนวนตัวแปรท้องถิ่นที่สามารถมีส่วนร่วมในการดำเนินงานของตลาดหลักทรัพย์สูงสุดคือเท่าไร
ฉันมีขั้นตอนการจัดเก็บที่มีตรรกะทางธุรกิจ ข้างในนั้นฉันมีตัวแปรประมาณ 1609 (อย่าถามฉันว่าทำไมนี่คือวิธีการทำงานของเครื่องยนต์) ฉันพยายามSETตัวแปรหนึ่งตัวต่อค่าที่เชื่อมโยงกันของตัวแปรอื่นทั้งหมด เป็นผลในระหว่างการสร้างฉันได้รับข้อผิดพลาด: ข่าวสารเกี่ยวกับ 8631, ระดับ 17, สถานะ 1, กระบวนงาน XXX, บรรทัด YYY ข้อผิดพลาดภายใน: ถึงขีด จำกัด สแต็กเซิร์ฟเวอร์แล้ว โปรดค้นหาการซ้อนที่อาจเกิดขึ้นในแบบสอบถามของคุณและพยายามทำให้มันง่ายขึ้น ฉันพบว่าข้อผิดพลาดเกิดจากจำนวนตัวแปรที่ฉันต้องใช้ในการSETดำเนินการ ฉันสามารถทำงานที่มอบหมายโดยแยกออกเป็นสองส่วน คำถามของฉันมีข้อ จำกัด บางประการในเรื่องนี้หรือไม่? ฉันตรวจสอบแล้ว แต่ไม่พบสิ่งใด เราตรวจสอบข้อผิดพลาดที่อธิบายในKBนี้ แต่นี่ไม่ใช่กรณีของเรา เราไม่ใช้CASEการแสดงออกใด ๆภายในรหัสของเรา เราใช้ตัวแปรชั่วคราวนั้นเพื่อเตรียมรายการค่าที่ต้องถูกแทนที่โดยใช้ฟังก์ชัน CLR เราอัปเดต SQL Server เป็น SP3 CU6 (รุ่นล่าสุด) แต่เรายังคงพบข้อผิดพลาด

2
SUM จาก DATALENGTHs ไม่ตรงกับขนาดตารางจาก sys.allocation_units
ฉันอยู่ภายใต้ความประทับใจว่าถ้าฉันจะรวมผลรวมDATALENGTH()ของเขตข้อมูลทั้งหมดสำหรับระเบียนทั้งหมดในตารางที่ฉันจะได้รับขนาดทั้งหมดของตาราง ฉันเข้าใจผิด SELECT SUM(DATALENGTH(Field1)) + SUM(DATALENGTH(Field2)) + SUM(DATALENGTH(Field3)) TotalSizeInBytes FROM SomeTable WHERE X, Y, and Z are true ฉันใช้แบบสอบถามนี้ด้านล่าง (ที่ฉันได้จากออนไลน์เพื่อรับขนาดตารางดัชนีคลัสเตอร์เท่านั้นดังนั้นจึงไม่รวมดัชนี NC) เพื่อรับขนาดของตารางเฉพาะในฐานข้อมูลของฉัน เพื่อวัตถุประสงค์ในการเรียกเก็บเงิน (เราเรียกเก็บเงินแผนกของเราตามจำนวนเนื้อที่ที่พวกเขาใช้) ฉันต้องทราบว่าแต่ละแผนกใช้พื้นที่เท่าใดในตารางนี้ ฉันมีแบบสอบถามที่ระบุแต่ละกลุ่มภายในตาราง ฉันแค่ต้องคิดออกว่าแต่ละกลุ่มจะมีพื้นที่ว่างเท่าใด ช่องว่างต่อแถวอาจแกว่งอย่างมากเนื่องจากVARCHAR(MAX)ฟิลด์ในตารางดังนั้นฉันจึงไม่สามารถใช้ขนาดเฉลี่ย * อัตราส่วนของแถวสำหรับแผนก เมื่อฉันใช้DATALENGTH()วิธีการที่อธิบายข้างต้นฉันได้รับเพียง 85% ของพื้นที่ทั้งหมดที่ใช้ในแบบสอบถามด้านล่าง คิด? SELECT s.Name AS SchemaName, t.NAME AS TableName, p.rows AS RowCounts, (SUM(a.total_pages) * 8)/1024 AS TotalSpaceMB, (SUM(a.used_pages) …

1
PAGELATCH_ สูงและรอ WRITELOG พวกเขาเกี่ยวข้องกันไหม
เราเห็นประเภทรอ PAGELATCH_EX และ PAGELATCH_SH สูงมากพร้อมกับรอ WRITELOG สูง ฉันได้วินิจฉัยแบบสอบถามที่ทำให้ PAGELATCH รอและสามารถกำจัดได้โดยลดอัตราการแทรกลงในคีย์หลักที่ทำคลัสเตอร์ไม่ว่างที่กำหนดด้วยค่าตัวตน ฉันเข้าใจว่าปรากฏการณ์นี้เป็นที่รู้จักกันในหน้าสุดท้ายแทรก latch contention อย่างไรก็ตามคำถามของฉันคือเมื่อมีการแทรกระเบียนใหม่ SQL Server จะใช้ PAGELATCH_EX แบบเอกสิทธิ์เฉพาะบุคคลบนหน้าบัฟเฟอร์แทรกระเบียนไปยังหน้าบัฟเฟอร์เขียนระเบียนลงในบันทึกธุรกรรมและจากนั้นปล่อย PAGELATCH_EX แบบละเอียดโดยละเอียดhttps: // www.microsoft.com/en-ie/download/details.aspx?id=26665หน้า 24 หรือเขียนบันทึกลงในบันทึกการทำธุรกรรมครั้งแรกก่อนที่จะใช้ PAGELATCH_EX โดยมีรายละเอียดว่า "การแก้ปัญหา PAGELATCH การแก้ปัญหาบนเวิร์กโหลด INSERT" ข้อมูลความเป็นมาSQLCAT's Guide to: Relational Engine หากบันทึกถูกเขียนเพื่อเข้าสู่ระบบนอกกลไกการล็อคแล้วฉันสามารถออกกฎเขียนช้าลงในดิสก์เป็นสาเหตุของ PAGELATCH สูงรอ แต่ถ้าสลักถูกเก็บไว้จนกว่าบันทึกจะแข็งขึ้นเพื่อเข้าสู่ระบบฉันควรพิจารณา WRITELOG นอกจากนี้การมีดัชนีที่ไม่ทำคลัสเตอร์หลายรายการจะทำให้ PAGELATCH_ * latch จัดขึ้นอีกต่อไปเช่นหากตารางมีดัชนีที่ทำคลัสเตอร์และหลายดัชนีที่ไม่ได้ทำคลัสเตอร์นั้นจะเพิ่มและปล่อยไปยังหน้าบัฟเฟอร์ดัชนีแต่ละหน้าพร้อมกันหรือไม่ อัปเดต 1 หลังจากอ่านconfio-sql-server-writelog-waitเลื่อนสองและสถาปัตยกรรม WAL …

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

1
แฮชรวม bailout
คำถามที่เกิดขึ้นในการสนทนาการแชท: ฉันรู้ว่าแฮชเข้าร่วม bailout สวิตช์ภายในเพื่อเรียงลำดับของลูปซ้อนกัน SQL Server ทำอะไรให้กับแฮชรวม bailout (ถ้ามันสามารถเกิดขึ้นได้ทั้งหมด)?

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

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

1
การวัดการขับไล่แผน
เรามี SQL Server 2016 SP1 โดยมีหน่วยความจำสูงสุดตั้งไว้ที่ 24GB เซิร์ฟเวอร์นี้มีคอมไพล์จำนวนมากโดยมีเพียง 10% ของคอมไพล์เหล่านี้มาจากคิวรี Ad-Hoc ดังนั้นแผนที่รวบรวมใหม่ควรเก็บไว้ในแผนแคช แต่ขนาดของแผนแคชจะไม่เพิ่มขึ้น (ประมาณ 3.72GB) ฉันสงสัยว่ามีแรงกดดันหน่วยความจำท้องถิ่นที่นำไปสู่การลบแผนจากแคช ขีดจำกัดความดันแคชของแผนคือ 5GB (75% ของหน่วยความจำเป้าหมายที่มองเห็นได้จาก 0-4GB + 10% ของหน่วยความจำเป้าหมายที่มองเห็นได้จาก 4GB-64GB + 5% ของหน่วยความจำเป้าหมายที่มองเห็น> 64GB) เมื่อ cachestore ถึง 75% ของขีด จำกัด แรงดันควรลบแผนออกจากแคช ในกรณีของฉัน 75% จาก 5 GB คือ 3.75GB ดังนั้นจึงเป็นไปได้ที่จะเป็นสาเหตุของการคอมไพล์สูง มีวิธีวัด (perfmon, Extended events, ... ) …

1
ดัชนีค้นหาต้นทุนผู้ประกอบการ
สำหรับแบบสอบถามฐานข้อมูลตัวอย่างAdventureWorksด้านล่าง: SELECT P.ProductID, CA.TransactionID FROM Production.Product AS P CROSS APPLY ( SELECT TOP (1) TH.TransactionID FROM Production.TransactionHistory AS TH WHERE TH.ProductID = P.ProductID ORDER BY TH.TransactionID DESC ) AS CA; แผนการดำเนินการแสดงค่าใช้จ่ายของผู้ให้บริการโดยประมาณ0.0850383 (93%) สำหรับดัชนีค้นหา : ค่าใช้จ่ายนั้นไม่ขึ้นอยู่กับรูปแบบการประมาณเชิงการใช้งาน ไม่ได้เป็นการเพิ่มต้นทุน CPU โดยประมาณและค่าใช้จ่ายI / O โดยประมาณอย่างง่าย ทั้งที่มันเป็นค่าใช้จ่ายสำหรับหนึ่งในการดำเนินการของดัชนีแสวงหาคูณด้วยจำนวนโดยประมาณของการประหารชีวิต หมายเลขค่าใช้จ่ายนี้มาถึงอย่างไร
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.