คำถามติดแท็ก clustered-index

ประเภทของดัชนีส่วนใหญ่ที่ใช้ใน SQL-Server ซึ่งจัดเรียงข้อมูลของตารางกับดัชนี

1
SQL Server - หน้าข้อมูลถูกจัดเก็บอย่างไรเมื่อใช้ดัชนีแบบคลัสเตอร์
ฉันเพิ่งได้ยินว่าหน้าข้อมูลในดัชนีคลัสเตอร์ไม่ได้ถูกจัดเก็บอย่างต่อเนื่อง มันเป็นเรื่องจริงเหรอ? บางทีหน้าข้อมูลมักจะถูกจัดเก็บอย่างต่อเนื่องพร้อมกับข้อยกเว้นบางอย่างสำหรับกฎ หรือบางทีฉันได้ยินผิดและหน้าข้อมูลถูกจัดเก็บอย่างต่อเนื่องเสมอ ขอบคุณมาก.

3
การจัดทำดัชนี PK GUID ใน SQL Server 2012
นักพัฒนาของฉันได้ติดตั้งแอปพลิเคชันของพวกเขาเพื่อใช้ GUID เป็น PK สำหรับตารางทั้งหมดของพวกเขาและโดยค่าเริ่มต้น SQL Server ได้ตั้งค่าดัชนีคลัสเตอร์บน PK เหล่านี้ ระบบนี้ค่อนข้างใหม่และตารางที่ใหญ่ที่สุดของเรามีมากกว่าหนึ่งล้านแถว แต่เรากำลังดูการจัดทำดัชนีของเราและต้องการให้สามารถปรับขนาดได้อย่างรวดเร็วเนื่องจากอาจมีความจำเป็นในอนาคตอันใกล้ ดังนั้นความโน้มเอียงแรกของฉันคือการย้ายดัชนีคลัสเตอร์ไปยังเขตข้อมูลที่สร้างขึ้นซึ่งเป็นตัวแทนขนาดใหญ่ของ DateTime อย่างไรก็ตามวิธีเดียวที่ฉันสามารถสร้าง CX ที่ไม่เหมือนใครคือการรวมคอลัมน์ GUID ใน CX นี้ แต่เรียงลำดับโดยสร้างขึ้นก่อน นี่จะทำให้คีย์การทำคลัสเตอร์กว้างเกินไปและจะเพิ่มประสิทธิภาพสำหรับการเขียนหรือไม่ การอ่านมีความสำคัญเช่นกัน แต่การเขียนอาจเป็นปัญหาที่ใหญ่กว่าในตอนนี้

2
เหตุใดมุมมองที่จัดทำดัชนีจึงไม่อนุญาตดัชนีที่ไม่ซ้ำกันแบบคลัสเตอร์
ฉันได้พิจารณาใช้การจัดทำดัชนีการดูเพื่อเพิ่มประสิทธิภาพในการดูที่ใช้บ่อยที่สุดของเรา อย่างไรก็ตามมุมมองที่จัดทำดัชนีไม่สนับสนุนดัชนีคลัสเตอร์ที่ไม่ซ้ำกันซึ่งไปเล็กน้อยกับความสำคัญที่กำหนดโดยส่วนที่เหลือของโครงสร้างฐานข้อมูล ตัวอย่างเช่นที่นี่เป็นเวอร์ชันที่เรียบง่ายของตารางของเราสองสามตัว -Groups- Group ID GroupName -Users- UserKey UserName FullName GroupID ดัชนีอยู่ใน Groups.GroupID (ไม่ทำคลัสเตอร์) และ Users.GroupID (ทำคลัสเตอร์) คีย์คลัสเตอร์ที่อยู่ใน GroupID ในตารางผู้ใช้เป็นช่วงที่ผู้ใช้จากกลุ่มที่เฉพาะเจาะจงมากที่สุดจะถูกดึง เห็นได้ชัดว่าคุณจะมีผู้ใช้หลายคนต่อกลุ่มดังนั้นดัชนีคลัสเตอร์นี้จะไม่ซ้ำกัน สิ่งนี้ทำให้ฉันมีความไม่แน่นอนเล็กน้อยเกี่ยวกับวิธีทำตามความสำคัญนี้เมื่อจัดทำดัชนีมุมมองของฉันเช่นตัวอย่างนี้เนื่องจากฉันไม่สามารถมีดัชนีคลัสเตอร์ที่ไม่ซ้ำกันได้ ConsumableID ConsumableVariantID AllowThresholdOverwrite FullPath GroupID ManufacturerID Type ModelID 101 29 1 0.1.2.4. 4 3 3 2 ในความเป็นจริงแล้วมีเพียงค่าเดียวในมุมมองนี้ซึ่งจะเป็นค่าที่ไม่ซ้ำกันคือคอลัมน์ ConsumableID ดังนั้นฉันจึงเหลือตัวเลือกเพียงเล็กน้อยว่าจะวางดัชนีของฉันไว้ที่ใด เหตุใด Views จึงไม่อนุญาตให้มีดัชนีที่ไม่ซ้ำกันในกลุ่มเมื่อตารางปกติทำ

2
การเลือกดัชนีแบบกลุ่ม - PK หรือ FK?
ฉันมีตารางSQL Server 2014ที่มีลักษณะดังต่อไปนี้: OrderId int not null IDENTITY --this is the primary key column OrderDate datetime2 not null CustomerId int not null Description nvarchar(255) null บางคนในทีมของฉันแนะนำว่าควรทำดัชนีคลัสเตอร์OrderIdแต่ฉันคิดว่าCustomerId+ OrderIdจะเป็นตัวเลือกที่ดีกว่าด้วยเหตุผลต่อไปนี้: แบบสอบถามเกือบทั้งหมดจะมองWHERE CustomerId = @paramไม่ใช่OrderId CustomerIdเป็น foreign key ไปยังCustomerตารางดังนั้นการมีดัชนีคลัสเตอร์ที่CustomerIdควรเพิ่มความเร็วในการรวม แม้ว่าCustomerIdจะไม่ซ้ำกันการมีOrderIdคอลัมน์เพิ่มเติมที่ระบุไว้ในดัชนีจะทำให้มั่นใจได้ว่าไม่ซ้ำกัน (เราสามารถใช้UNIQUEคำหลักเมื่อสร้างดัชนีคลัสเตอร์ในคอลัมน์ 2 คอลัมน์เหล่านั้นเพื่อหลีกเลี่ยงค่าใช้จ่ายที่ไม่มีเอกลักษณ์) เมื่อแทรกข้อมูลแล้วCustomerIdและOrderIdไม่เปลี่ยนแปลงดังนั้นแถวเหล่านี้จะไม่ย้ายไปหลังจากการเขียนครั้งแรก การเข้าถึงข้อมูลเกิดขึ้นผ่านทาง ORM ที่ร้องขอคอลัมน์ทั้งหมดตามค่าเริ่มต้นดังนั้นเมื่อมีการค้นหาตามCustomerIdมาดัชนีดัชนีคลัสเตอร์จะสามารถให้คอลัมน์ทั้งหมดโดยไม่ต้องทำงานเพิ่มเติมใด ๆ ที่ไม่CustomerIdและOrderIdเสียงเช่นวิธีการเลือกที่ดีที่สุดที่กำหนดข้างต้น หรือเป็นOrderIdของตัวเองดีกว่าเพราะมันเป็นคอลัมน์เดียวที่รับประกันความโดดเด่นด้วยตัวเอง? ขณะนี้ตารางมีดัชนีคลัสเตอร์บนOrderIdและดัชนีที่CustomerIdไม่ได้ทำคลัสเตอร์แต่มันไม่ครอบคลุมดังนั้นเนื่องจากเราใช้ ORM และมีการร้องขอคอลัมน์ทั้งหมดจึงเป็นงานพิเศษเพื่อดึงข้อมูลออกมา ดังนั้นเมื่อโพสต์นี้ฉันพยายามพิจารณาปรับปรุงประสิทธิภาพด้วย …

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
noexpand hint สำหรับรุ่นที่ไม่ใช่ enterpise และประสิทธิภาพ
ฉันต้องใช้มุมมองที่จัดทำดัชนีเพื่อให้ได้ประสิทธิภาพ อย่างที่ฉันเห็นจากตารางเปรียบเทียบรุ่นมาตรฐานนี้ไม่รองรับมุมมองที่จัดทำดัชนีไว้ แต่ BOL พูดว่า: สามารถสร้างมุมมองที่จัดทำดัชนีใน SQL Server รุ่นใดก็ได้ ใน SQL Server Enterprise เครื่องมือเพิ่มประสิทธิภาพคิวรีจะพิจารณามุมมองที่จัดทำดัชนีโดยอัตโนมัติ หากต้องการใช้มุมมองที่จัดทำดัชนีไว้ในรุ่นอื่น ๆ ทั้งหมดจะต้องใช้คำใบ้ตาราง NOEXPAND มันจะทำงานได้ดี (ฉันกำลังพูดถึงการแสดง) select * from dbo.OrderTotals with (noexpand, index=IXCU_OrderTotals) บน SQL Server Standard edition และทำงานได้ select * from dbo.OrderTotals ในองค์กรหรือไม่ นี่คือรหัสสำหรับการดู: CREATE VIEW dbo.OrderTotals WITH SCHEMABINDING AS select OrderId = r.OrderId , …

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

2
การสร้างดัชนีแบบกลุ่มล้มเหลวในการสร้างตาราง
เราพบข้อผิดพลาดเมื่อเรียกใช้สคริปต์ต่อไปนี้ IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE TABLE' AND TABLE_NAME='Table_Name') BEGIN CREATE TABLE Table_Name ( Field_Name_1 binary(32) NOT NULL CONSTRAINT PK_Name_Goes_Here PRIMARY KEY NONCLUSTERED , Field_Name_2 int NOT NULL , Field_Name_3 datetime NOT NULL INDEX IX_Name_Goes_Here CLUSTERED ) END โดยเฉพาะอย่างยิ่งมันคือการสร้างดัชนีคลัสเตอร์ที่แสดงข้อผิดพลาดต่อไปนี้: ข่าวสารเกี่ยวกับ 1018, ระดับ 15, สถานะ 1, บรรทัดที่ …

2
ฟิลด์“ นอกแถว” ถูกอ่านเมื่อใช้ดัชนีกลุ่มหรือไม่
ฉันรู้ว่าเมื่อVARCHAR(MAX)/NVARCHAR(MAX)มีการใช้คอลัมน์ข้อมูลจะถูกเก็บไว้out of the row- แถวข้อมูลจะมีตัวชี้ไปยังตำแหน่งอื่นที่จัดเก็บ 'ค่ามาก' ฉันมีคำถามต่อไปนี้: อยู่ในแต่ละเขตข้อมูลที่เก็บไว้out of the rowหรือเพียงmaxคน? หากคุณกำลังใช้clustered indexตารางเพื่ออ่านระเบียนทั้งหมดเขตข้อมูลที่เก็บอยู่นอกแถวจะถูกอ่านด้วยหรือไม่ VARCHAR (MAX) หรือ NVARCHAR (MAX) ถือเป็น 'ประเภทค่าขนาดใหญ่' ประเภทค่าขนาดใหญ่มักจะเก็บไว้ที่ 'ออกจากแถว' มันหมายความว่า ...

3
สร้างใหม่ในดัชนีคลัสเตอร์ทำไมชุดข้อมูลย่อขนาด
เมื่อเราทำการสร้างใหม่ในดัชนีคลัสเตอร์บนตารางที่มีข้อมูลประมาณ 15gb ในนั้นและ datasize หดเป็น 5gb สิ่งนี้จะเป็นอย่างไร "data" ประเภทใดที่ถูกลบออกไป? ขนาดข้อมูล i หมายถึงคอลัมน์ "data" ของ DBCC sp_spaceused ก่อนสร้างใหม่บนดัชนีคลัสเตอร์: name rows reserved data index_size unused LEDGERJOURNALTRANS 43583730 39169656 KB 15857960 KB 22916496 KB 395200 KB หลังจากสร้างใหม่บนดัชนีคลัสเตอร์: name rows reserved data index_size unused LEDGERJOURNALTRANS 43583730 29076736 KB 5867048 KB 22880144 KB 329544 KB …

1
ทำไม UPDATE เทียบกับตารางที่มีทริกเกอร์ INSTEAD OF UPDATE ดูเหมือนว่าจะทำการแทรกดัชนีคลัสเตอร์รวมถึงการอัพเดตดัชนีคลัสเตอร์
ฉันจะเริ่มต้นด้วยตัวอย่างง่ายๆมาก: สองตารางทั้งคู่ด้วย schema เดียวกันทำคลัสเตอร์บน PK แต่หนึ่งในนั้นมีINSTEAD OF UPDATEทริกเกอร์: CREATE TABLE Standard ( PK UNIQUEIDENTIFIER PRIMARY KEY CLUSTERED, V INT NOT NULL ) GO CREATE TABLE InsteadOf ( PK UNIQUEIDENTIFIER PRIMARY KEY CLUSTERED, V INT NOT NULL ) GO INSERT Standard (PK, V) VALUES ('1E58B555-B073-471E-B576-4B09C8E18976', 0) INSERT InsteadOf (PK, V) VALUES …

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

3
ดัชนีที่ไม่ทำคลัสเตอร์รับประกันเกี่ยวกับลำดับแถวหรือไม่?
ฉันมีนักพัฒนาที่ต้องการเมื่อทำคำสั่งเลือกโดยไม่มีคำสั่งโดยแถวในตารางจะอยู่ในลำดับที่พวกเขาถูกแทรก ผู้พัฒนาแนะนำให้เปลี่ยนจากดัชนีเป็นคลัสเตอร์ที่ไม่ใช่คลัสเตอร์ ด้วยการเปลี่ยนดัชนีจากคลัสเตอร์เป็นไม่ใช่คลัสเตอร์สิ่งนี้ทำให้การรับประกันใด ๆ เกี่ยวกับลำดับของแถวที่จะปรากฏในตารางหรือไม่? คำถามนี้ส่วนใหญ่สำหรับความอยากรู้ของฉัน; ฉันจะแนะนำให้ใช้คอลัมน์ข้อมูลประจำตัวแทน แต่คำขอนี้ทำให้ฉันคิด สามารถใช้การประทับเวลา แต่มีแถวโอกาสที่สามารถแทรกพร้อมกันได้ ขอบคุณล่วงหน้าสำหรับความช่วยเหลือของ.

3
ฉันควรเพิ่มฟิลด์การเพิ่ม / ตัวตนอัตโนมัติลงในตารางตัวอ้างอิงโยงเพื่อวัตถุประสงค์ในการ PK หรือไม่
ฉันเพิ่มตารางการอ้างอิงโยงต่อไปนี้ในฐานข้อมูลที่โฮสต์บน SQL Server ของฉัน: company_id bigint not null (FK) org_path nvarchar (2048) not null company_idข้อมูลหมายถึงidข้อมูลในตารางอื่น (ซึ่งมันเป็นคีย์หลัก) ระบุว่ายังสามารถมีได้หลายระเบียนด้วยเหมือนกัน company_idคีย์หลักใด ๆ จะต้องใช้ทั้งสองเขตข้อมูล อย่างไรก็ตามฉันไม่สามารถสร้างคีย์โดยใช้ทั้งสองฟิลด์ได้เนื่องจากorg_pathSQL Server ยาวเกินไป สำหรับorg_pathนี่เป็นตารางเดียวที่มีอยู่ มีโอกาสทุกคนที่คำสั่งไปยังตารางนี้จะถูกถามอย่างใดอย่างหนึ่งคือทุกรายการหรือทุกรายการโดยorg_path company_idหรือจะใช้วิธีอื่นดูน่าสงสัยว่าตารางนี้จะถูกสอบถามโดยorg_pathหรือจะนำไปทางอื่นก็มีลักษณะที่น่าสงสัยว่าตารางนี้จะเคยได้รับการสอบถามโดยนอกจากนี้ยังไม่น่าorg_pathจะมีการอัปเดตและมีแนวโน้มที่จะถูกแทรกและอาจถูกลบ ฉันคาดหวังว่าจำนวนแถวทั้งหมดจะอยู่ในพันต่ำ นอกจากนี้สาเหตุที่nvarchar (2048)เป็นเพราะค่าต้องเลียนแบบในฐานข้อมูลบุคคลที่สาม ตัวอย่างทั่วไปจะเป็นสิ่งที่ต้องการ \Translation Providers\[customer name]\[order name]\ และสามารถมีกำกับได้ ดังนั้นคำถามของฉันคือ: มันจะมีประสิทธิภาพมากขึ้นในการเพิ่มidเขตข้อมูลการเพิ่มอัตโนมัติและใช้ร่วมกับcompany_idเป็นคีย์หลักหรือมันจะเพิ่มค่าใช้จ่ายที่ไม่จำเป็น - และความจริงที่ว่าcompany_idเป็นคีย์หลักในตารางอื่นมี ผลที่นี่?

1
PostgreSQL จะสั่งซื้อเร็กคอร์ดใหม่บนดิสก์ได้อย่างไร (หลังคลัสเตอร์บนคีย์หลัก)
จำเป็นต้องรู้วิธีการสั่งซื้อ PostgreSQL บนดิสก์ ในกรณีนี้ฉันต้องการใช้ประโยชน์จากชุดค่าผสมดัชนีตามที่ระบุในเอกสารซึ่งตามที่ฉันเข้าใจใช้บิตแมปเพื่อรับแถวที่ตรงกันและคืนค่าตามตำแหน่งทางกายภาพของพวกเขา ตารางในคำถามถูกทำคลัสเตอร์โดยคีย์หลัก ตามที่ฉันเข้าใจแล้ว PostgreSQL จะไม่ทำการจัดกลุ่มโดยอัตโนมัติหลังจากการจัดกลุ่มเสร็จสิ้น (แม้ว่าจะจำได้ว่าจัดกลุ่มตามดัชนีที่แน่นอน) ตอนนี้เนื่องจากนี่คือคีย์หลักฉันสงสัยว่าคำสั่งเก็บข้อมูลจริงจะเป็นไปตามนั้นหรือไม่ (ซึ่งถ้าเป็นจริงฉันต้องการใช้เพื่อประโยชน์ของเราสำหรับการสืบค้นเฉพาะ) โดยสรุป PostgreSQL จะสั่งซื้อเรกคอร์ดใหม่โดยเฉพาะอย่างยิ่งหลังจากการจัดกลุ่มได้อย่างไร ขอบคุณมาก ๆ!
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.