ในฐานะที่เป็นคำตอบอื่น ๆ แล้วบ่งบอกถึง SQL Server insert
หรืออาจจะไม่ชัดเจนให้มั่นใจว่าแถวจะเรียงตามลำดับดัชนีคลัสเตอร์ก่อนที่จะมี
สิ่งนี้ขึ้นอยู่กับว่าตัวดำเนินการดัชนีคลัสเตอร์ในแผนมีDMLRequestSort
ชุดคุณสมบัติ (ซึ่งจะขึ้นอยู่กับจำนวนแถวที่ประมาณไว้ที่แทรกไว้)
หากคุณพบว่า SQL Server จะประเมินนี้ด้วยเหตุผลใดก็ตามที่คุณอาจได้รับประโยชน์จากการเพิ่มอย่างชัดเจนORDER BY
กับSELECT
แบบสอบถามเพื่อลดการแยกหน้าและต่อมาการกระจายตัวจากINSERT
การดำเนินงาน
ตัวอย่าง:
use tempdb;
GO
CREATE TABLE T(N INT PRIMARY KEY,Filler char(2000))
CREATE TABLE T2(N INT PRIMARY KEY,Filler char(2000))
GO
DECLARE @T TABLE (U UNIQUEIDENTIFIER PRIMARY KEY DEFAULT NEWID(),N int)
INSERT INTO @T(N)
SELECT number
FROM master..spt_values
WHERE type = 'P' AND number BETWEEN 0 AND 499
/*Estimated row count wrong as inserting from table variable*/
INSERT INTO T(N)
SELECT T1.N*1000 + T2.N
FROM @T T1, @T T2
/*Same operation using explicit sort*/
INSERT INTO T2(N)
SELECT T1.N*1000 + T2.N
FROM @T T1, @T T2
ORDER BY T1.N*1000 + T2.N
SELECT avg_fragmentation_in_percent,
fragment_count,
page_count,
avg_page_space_used_in_percent,
record_count
FROM sys.dm_db_index_physical_stats(2, OBJECT_ID('T'), NULL, NULL, 'DETAILED')
;
SELECT avg_fragmentation_in_percent,
fragment_count,
page_count,
avg_page_space_used_in_percent,
record_count
FROM sys.dm_db_index_physical_stats(2, OBJECT_ID('T2'), NULL, NULL, 'DETAILED')
;
แสดงให้เห็นว่าT
มีการแยกส่วนอย่างหนาแน่น
avg_fragmentation_in_percent fragment_count page_count avg_page_space_used_in_percent record_count
---------------------------- -------------------- -------------------- ------------------------------ --------------------
99.3116118225536 92535 92535 67.1668272794663 250000
99.5 200 200 74.2868173956017 92535
0 1 1 32.0978502594514 200
แต่สำหรับการT2
แยกส่วนน้อยที่สุด
avg_fragmentation_in_percent fragment_count page_count avg_page_space_used_in_percent record_count
---------------------------- -------------------- -------------------- ------------------------------ --------------------
0.376 262 62500 99.456387447492 250000
2.1551724137931 232 232 43.2438349394613 62500
0 1 1 37.2374598468001 232
ในทางกลับกันบางครั้งคุณอาจต้องการบังคับให้ SQL Server ประเมินค่าจำนวนแถวต่ำเกินไปเมื่อคุณรู้ว่าข้อมูลได้ถูกจัดเรียงไว้ล่วงหน้าแล้วและต้องการหลีกเลี่ยงการเรียงลำดับที่ไม่จำเป็น ตัวอย่างหนึ่งที่น่าสังเกตคือเมื่อใส่จำนวนแถวจำนวนมากลงในตารางด้วยnewsequentialid
คีย์ดัชนีคลัสเตอร์ ในรุ่นของ SQL Server ก่อนที่จะ Denali SQL Server เพิ่มดำเนินการเรียงลำดับไม่จำเป็นและอาจมีราคาแพง สิ่งนี้สามารถหลีกเลี่ยงได้โดย
DECLARE @var INT =2147483647
INSERT INTO Foo
SELECT TOP (@var) *
FROM Bar
SQL Server จะประมาณว่า 100 แถวจะถูกแทรกโดยไม่คำนึงถึงขนาดBar
ที่ต่ำกว่าขีด จำกัด ที่เพิ่มการเรียงลำดับลงในแผน อย่างไรก็ตามดังที่ระบุไว้ในความคิดเห็นด้านล่างนี้หมายความว่าการแทรกจะไม่สามารถใช้ประโยชน์จากการบันทึกขั้นต่ำ