Bir şeyleri hızlandırmak için dizinleri deniyordum, ancak bir katılım durumunda, dizin sorgu yürütme süresini iyileştirmiyor ve bazı durumlarda işleri yavaşlatıyor.
Test tablosu oluşturma ve verilerle doldurma sorgusu:
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])
Şimdi iyileştirilmiş olan sorgu 1, (sadece hafif ama iyileştirme tutarlı):
SELECT *
FROM IndexTestTable I1
JOIN IndexTestTable I2
ON I1.ID = I2.ID
WHERE I1.Name = 'Name1'
Dizinsiz İstatistikler ve Uygulama Planı (bu durumda tablo varsayılan kümelenmiş dizini kullanır):
(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.
Şimdi Dizin etkinken:
(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.
Şimdi, dizin nedeniyle yavaşlayan sorgu (yalnızca test için oluşturulduğundan sorgu anlamsızdır):
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
Kümelenmiş indeks etkinken:
(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.
Şimdi Dizin devre dışıyken:
(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.
Sorular:
- Dizin, SQL Server tarafından önerilse de, neden önemli bir fark yaratabiliyor?
- Çoğu zaman alan İç İçe Döngü birleşimi nedir ve yürütme süresini nasıl geliştirirsiniz?
- Yanlış yaptığım ya da kaçırdığım bir şey var mı?
- Varsayılan dizinde (yalnızca birincil anahtarda) neden daha az zaman alıyor ve kümelenmemiş dizin mevcutsa, birleştirme tablosundaki her satır için, birleştirilmiş tablo satırının daha hızlı bulunması gerekir, çünkü birleştirme adı sütununda Dizin oluşturuldu. Bu, sorgu yürütme planına yansır ve IndexA etkinken Index Seek maliyeti, IndexA etkinken daha düşüktür, ancak neden hala daha yavaş? Ayrıca yavaşlamaya neden olan Yuvalanmış Döngü sol dış birleştirmesinde neler var?
SQL Server 2012'yi Kullanma