Saya dapat mereproduksi masalah kinerja kueri yang saya gambarkan sebagai tidak terduga. Saya mencari jawaban yang berfokus pada internal.
Di mesin saya, kueri berikut melakukan pemindaian indeks berkerumun dan membutuhkan sekitar 6,8 detik waktu 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);
Kueri berikut melakukan pencarian indeks berkerumun (hanya perbedaan yang menghilangkan FORCESCAN
petunjuk) tetapi membutuhkan waktu CPU sekitar 18,2 detik:
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);
Paket kueri sangat mirip. Untuk kedua kueri ada 120000001 baris yang dibaca dari indeks berkerumun:
Saya menggunakan SQL Server 2017 CU 10. Ini adalah kode untuk membuat dan mengisi two_col_key_test
tabel:
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;
Saya berharap jawaban yang lebih dari sekadar panggilan pelaporan tumpukan. Sebagai contoh, saya dapat melihat bahwa sqlmin!TCValSSInRowExprFilter<231,0,0>::GetDataX
dibutuhkan siklus CPU lebih banyak dalam permintaan lambat dibandingkan dengan yang cepat:
Alih-alih berhenti di sana, saya ingin memahami apa itu dan mengapa ada perbedaan besar antara dua pertanyaan.
Mengapa ada perbedaan besar dalam waktu CPU untuk dua pertanyaan ini?