สิ่งนี้ขึ้นอยู่กับดัชนีและประเภทข้อมูล
ตัวอย่างการใช้ฐานข้อมูล Stack Overflow นี่คือลักษณะที่ตารางผู้ใช้มีลักษณะดังนี้:
มันมี PK / CX ในคอลัมน์ Id ดังนั้นมันจึงเป็นข้อมูลตารางทั้งหมดที่เรียงลำดับตาม Id
ด้วยสิ่งนั้นเป็นดัชนีเพียงอย่างเดียว SQL ต้องอ่านสิ่งนั้นทั้งหมด (ส่งคอลัมน์ LOB) ไปยังหน่วยความจำหากยังไม่มีอยู่
DBCC DROPCLEANBUFFERS-- Don't run this anywhere near prod.
SET STATISTICS TIME, IO ON
SELECT u.Id
INTO #crap1
FROM dbo.Users AS u
เวลาสถิติและโปรไฟล์ io มีลักษณะดังนี้:
Table 'Users'. Scan count 7, logical reads 80846, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
SQL Server Execution Times:
CPU time = 2406 ms, elapsed time = 446 ms.
ถ้าฉันเพิ่มดัชนีแบบ nonclustered เพิ่มเติมใน Just Id
CREATE INDEX ix_whatever ON dbo.Users (Id)
ตอนนี้ฉันมีดัชนีที่เล็กกว่ามากซึ่งตรงกับคำค้นหาของฉัน
DBCC DROPCLEANBUFFERS-- Don't run this anywhere near prod.
SELECT u.Id
INTO #crap2
FROM dbo.Users AS u
รายละเอียดที่นี่:
Table 'Users'. Scan count 7, logical reads 6587, physical reads 0, read-ahead reads 6549, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
SQL Server Execution Times:
CPU time = 2344 ms, elapsed time = 384 ms.
เราสามารถอ่านและลดเวลาซีพียูได้น้อยลง
หากไม่มีข้อมูลเพิ่มเติมเกี่ยวกับคำนิยามตารางของคุณฉันไม่สามารถลองทำซ้ำสิ่งที่คุณพยายามวัดได้ดีกว่า
แต่คุณกำลังบอกว่าถ้าไม่มีดัชนีเฉพาะในคอลัมน์เดียวนั้นคอลัมน์ / ฟิลด์อื่น ๆ จะถูกสแกนด้วยหรือไม่ นี่เป็นเพียงข้อเสียเปรียบในการออกแบบตาราง rowstore หรือไม่? เหตุใดจึงต้องสแกนฟิลด์ที่ไม่เกี่ยวข้อง
ใช่นี่เป็นตารางเฉพาะสำหรับ rowstore ข้อมูลจะถูกจัดเก็บโดยแถวในหน้าข้อมูล แม้ว่าข้อมูลอื่นบนหน้าเว็บนั้นไม่เกี่ยวข้องกับการสืบค้นของคุณดัชนีทั้งหน้า> หน้า> นั้นจะต้องอ่านในหน่วยความจำ ฉันจะไม่พูดว่าคอลัมน์อื่น ๆ นั้น "สแกน" มากที่สุดเท่าที่หน้าที่มีอยู่นั้นจะถูกสแกนเพื่อดึงค่าเดียวที่เกี่ยวข้องกับข้อความค้นหา
ใช้ตัวอย่างสมุดโทรศัพท์ ol ': แม้ว่าคุณจะเพิ่งอ่านหมายเลขโทรศัพท์เมื่อคุณเปลี่ยนหน้าคุณจะเปลี่ยนนามสกุลชื่อที่อยู่ ฯลฯ พร้อมด้วยหมายเลขโทรศัพท์