ฉันสามารถสร้างปัญหาประสิทธิภาพการสืบค้นที่ฉันจะอธิบายได้อย่างไม่คาดคิด ฉันกำลังมองหาคำตอบที่มุ่งเน้นไปที่ภายใน
บนเครื่องของฉันเคียวรีต่อไปนี้ทำการสแกนดัชนีแบบคลัสเตอร์และใช้เวลาประมาณ 6.8 วินาทีของเวลา CPU:
SELECT ID1, ID2
FROM two_col_key_test WITH (FORCESCAN)
WHERE ID1 NOT IN
(
N'1', N'2',N'3', N'4', N'5',
N'6', N'7', N'8', N'9', N'10',
N'11', N'12',N'13', N'14', N'15',
N'16', N'17', N'18', N'19', N'20'
)
AND (ID1 = N'FILLER TEXT' AND ID2 >= N'' OR (ID1 > N'FILLER TEXT'))
ORDER BY ID1, ID2 OFFSET 12000000 ROWS FETCH FIRST 1 ROW ONLY
OPTION (MAXDOP 1);
แบบสอบถามต่อไปนี้จะค้นหาดัชนีแบบคลัสเตอร์ (ข้อแตกต่างคือการลบFORCESCAN
คำใบ้ออก) แต่ใช้เวลา CPU ประมาณ 18.2 วินาที:
SELECT ID1, ID2
FROM two_col_key_test
WHERE ID1 NOT IN
(
N'1', N'2',N'3', N'4', N'5',
N'6', N'7', N'8', N'9', N'10',
N'11', N'12',N'13', N'14', N'15',
N'16', N'17', N'18', N'19', N'20'
)
AND (ID1 = N'FILLER TEXT' AND ID2 >= N'' OR (ID1 > N'FILLER TEXT'))
ORDER BY ID1, ID2 OFFSET 12000000 ROWS FETCH FIRST 1 ROW ONLY
OPTION (MAXDOP 1);
แผนแบบสอบถามคล้ายกันมาก สำหรับเคียวรีทั้งสองมีการอ่านแถว 120000001 จากดัชนีคลัสเตอร์:
ฉันอยู่ใน SQL Server 2017 CU 10 นี่คือรหัสในการสร้างและเติมtwo_col_key_test
ตาราง:
drop table if exists dbo.two_col_key_test;
CREATE TABLE dbo.two_col_key_test (
ID1 NVARCHAR(50) NOT NULL,
ID2 NVARCHAR(50) NOT NULL,
FILLER NVARCHAR(50),
PRIMARY KEY (ID1, ID2)
);
DROP TABLE IF EXISTS #t;
SELECT TOP (4000) 0 ID INTO #t
FROM master..spt_values t1
CROSS JOIN master..spt_values t2
OPTION (MAXDOP 1);
INSERT INTO dbo.two_col_key_test WITH (TABLOCK)
SELECT N'FILLER TEXT' + CASE WHEN ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) > 8000000 THEN N' 2' ELSE N'' END
, ROW_NUMBER() OVER (ORDER BY (SELECT NULL))
, NULL
FROM #t t1
CROSS JOIN #t t2;
ฉันหวังว่าจะได้รับคำตอบที่มากกว่าการรายงานสแต็คการโทร ตัวอย่างเช่นฉันเห็นว่าsqlmin!TCValSSInRowExprFilter<231,0,0>::GetDataX
ใช้รอบ CPU มากขึ้นอย่างมากในการสืบค้นที่ช้าเมื่อเปรียบเทียบกับการตอบสนองที่รวดเร็ว:
แทนที่จะหยุดตรงนั้นฉันอยากจะเข้าใจว่ามันคืออะไรและทำไมมันถึงมีความแตกต่างอย่างมากระหว่างสองข้อความค้นหา
เหตุใดเวลา CPU แตกต่างกันมากสำหรับทั้งสองคิวรี