Diberikan tabel tumpukan berikut dengan 400 baris bernomor 1 hingga 400:
DROP TABLE IF EXISTS dbo.N;
GO
SELECT
SV.number
INTO dbo.N
FROM master.dbo.spt_values AS SV
WHERE
SV.[type] = N'P'
AND SV.number BETWEEN 1 AND 400;
dan pengaturan berikut:
SET NOCOUNT ON;
SET STATISTICS IO, TIME OFF;
SET STATISTICS XML OFF;
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
SELECT
Pernyataan berikut selesai dalam waktu sekitar 6 detik ( demo , paket ):
DECLARE @n integer = 400;
SELECT
c = COUNT_BIG(*)
FROM dbo.N AS N
CROSS JOIN dbo.N AS N2
CROSS JOIN dbo.N AS N3
WHERE
N.number <= @n
AND N2.number <= @n
AND N3.number <= @n
OPTION
(OPTIMIZE FOR (@n = 1));
Catatan: OPTIMIZE FOR
Klausa @ hanya demi menghasilkan repro berukuran masuk akal yang menangkap detail penting dari masalah nyata, termasuk kardinalitas salah menaksir yang dapat muncul karena berbagai alasan.
Ketika output baris tunggal ditulis ke tabel, dibutuhkan 19 detik ( demo , paket ):
DECLARE @T table (c bigint NOT NULL);
DECLARE @n integer = 400;
INSERT @T
(c)
SELECT
c = COUNT_BIG(*)
FROM dbo.N AS N
CROSS JOIN dbo.N AS N2
CROSS JOIN dbo.N AS N3
WHERE
N.number <= @n
AND N2.number <= @n
AND N3.number <= @n
OPTION
(OPTIMIZE FOR (@n = 1));
Rencana pelaksanaan tampak identik selain dari memasukkan satu baris.
Semua waktu ekstra tampaknya dikonsumsi oleh penggunaan CPU.
Mengapa INSERT
pernyataan itu jauh lebih lambat?