Cho bảng heap sau với 400 hàng được đánh số từ 1 đến 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;
và các cài đặt sau:
SET NOCOUNT ON;
SET STATISTICS IO, TIME OFF;
SET STATISTICS XML OFF;
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
Câu SELECT
lệnh sau hoàn thành trong khoảng 6 giây ( bản demo , kế hoạch ):
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));
Lưu ý: @ OPTIMIZE FOR
Mệnh đề này chỉ nhằm mục đích tạo ra một repro có kích thước hợp lý, nắm bắt các chi tiết thiết yếu của vấn đề thực sự, bao gồm cả sự sai lệch về tim mạch có thể phát sinh vì nhiều lý do.
Khi đầu ra một hàng được ghi vào bảng, phải mất 19 giây ( bản demo , kế hoạch ):
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));
Các kế hoạch thực hiện xuất hiện giống hệt nhau ngoài việc chèn một hàng.
Tất cả thời gian thêm dường như được sử dụng bởi CPU.
Tại sao INSERT
tuyên bố chậm hơn nhiều?