Tôi đã thử nghiệm với các chỉ mục để tăng tốc mọi thứ, nhưng trong trường hợp tham gia, chỉ mục không cải thiện thời gian thực hiện truy vấn và trong một số trường hợp, nó đang làm mọi thứ chậm lại.
Truy vấn để tạo bảng thử nghiệm và điền vào nó với dữ liệu là:
CREATE TABLE [dbo].[IndexTestTable](
[id] [int] IDENTITY(1,1) PRIMARY KEY,
[Name] [nvarchar](20) NULL,
[val1] [bigint] NULL,
[val2] [bigint] NULL)
DECLARE @counter INT;
SET @counter = 1;
WHILE @counter < 500000
BEGIN
INSERT INTO IndexTestTable
(
-- id -- this column value is auto-generated
NAME,
val1,
val2
)
VALUES
(
'Name' + CAST((@counter % 100) AS NVARCHAR),
RAND() * 10000,
RAND() * 20000
);
SET @counter = @counter + 1;
END
-- Index in question
CREATE NONCLUSTERED INDEX [IndexA] ON [dbo].[IndexTestTable]
(
[Name] ASC
)
INCLUDE ( [id],
[val1],
[val2])
Bây giờ truy vấn 1, được cải thiện (chỉ một chút nhưng sự cải thiện là phù hợp) là:
SELECT *
FROM IndexTestTable I1
JOIN IndexTestTable I2
ON I1.ID = I2.ID
WHERE I1.Name = 'Name1'
Số liệu thống kê và kế hoạch thực hiện không có Index (trong trường hợp này là bảng sử dụng chỉ mục được nhóm mặc định):
(5000 row(s) affected)
Table 'IndexTestTable'. Scan count 2, logical reads 5580, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
(1 row(s) affected)
SQL Server Execution Times:
CPU time = 109 ms, elapsed time = 294 ms.
Bây giờ với Index được bật:
(5000 row(s) affected)
Table 'IndexTestTable'. Scan count 2, logical reads 2819, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
(1 row(s) affected)
SQL Server Execution Times:
CPU time = 94 ms, elapsed time = 231 ms.
Bây giờ truy vấn chậm lại do chỉ mục (truy vấn là vô nghĩa vì nó chỉ được tạo để thử nghiệm):
SELECT I1.Name,
SUM(I1.val1),
SUM(I1.val2),
MIN(I2.Name),
SUM(I2.val1),
SUM(I2.val2)
FROM IndexTestTable I1
JOIN IndexTestTable I2
ON I1.Name = I2.Name
WHERE
I2.Name = 'Name1'
GROUP BY
I1.Name
Với chỉ số cụm được kích hoạt:
(1 row(s) affected)
Table 'IndexTestTable'. Scan count 4, logical reads 60, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Worktable'. Scan count 1, logical reads 155106, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
(1 row(s) affected)
SQL Server Execution Times:
CPU time = 17207 ms, elapsed time = 17337 ms.
Bây giờ với Index bị vô hiệu hóa:
(1 row(s) affected)
Table 'IndexTestTable'. Scan count 5, logical reads 8642, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Worktable'. Scan count 2, logical reads 165212, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
(1 row(s) affected)
SQL Server Execution Times:
CPU time = 17691 ms, elapsed time = 9073 ms.
Các câu hỏi là:
- Mặc dù chỉ mục được đề xuất bởi SQL Server, tại sao nó làm mọi thứ chậm lại bởi một sự khác biệt đáng kể?
- Tham gia Nested Loop đang chiếm phần lớn thời gian và làm thế nào để cải thiện thời gian thực hiện của nó?
- Có điều gì đó mà tôi đang làm sai hoặc đã bỏ lỡ?
- Với chỉ mục mặc định (chỉ trên khóa chính), tại sao lại mất ít thời gian hơn và với chỉ mục không được nhóm hiện diện, đối với mỗi hàng trong bảng tham gia, hàng bảng tham gia sẽ được tìm thấy nhanh hơn, bởi vì tham gia nằm trên cột Tên trên đó chỉ số đã được tạo. Điều này được phản ánh trong kế hoạch thực hiện truy vấn và chi phí Tìm kiếm Index sẽ ít hơn khi IndexA hoạt động, nhưng tại sao vẫn chậm hơn? Ngoài ra những gì trong Nested Loop bên ngoài tham gia bên ngoài đang gây ra sự chậm lại?
Sử dụng SQL Server 2012