以下のSELECT
ステートメント(下記)はインデックスシークを使用していませんが、インデックススキャンはなぜですか?行の数が少なすぎるか、何か不足していますか?オプティマイザがインデックスを使用しないのはなぜですか?
テストデータ:
-- Init Tables
IF OBJECT_ID ('tempdb..#wat') IS NOT NULL
DROP TABLE #wat;
IF OBJECT_ID ('tempdb..#jam') IS NOT NULL
DROP TABLE #jam;
CREATE TABLE #wat (
ID INT IDENTITY(1,1) NOT NULL,
Name VARCHAR(15) NOT NULL,
Den DATETIME NOT NULL
)
CREATE TABLE #jam (
ID INT IDENTITY(1,1) NOT NULL,
Name VARCHAR(15) NOT NULL
)
-- Populate Temp Tables with Random Data
DECLARE @length INT
,@charpool VARCHAR(255)
,@poolLength INT
,@RandomString VARCHAR(255)
,@LoopCount INT
SET @Length = RAND() * 5 + 8
SET @CharPool = 'abcdefghijkmnopqrstuvwxyzABCDEFGHIJKLMNPQRSTUVWXYZ23456789'
SET @PoolLength = LEN(@CharPool)
SET @LoopCount = 0
SET @RandomString = ''
WHILE (@LoopCount < 500)
BEGIN
INSERT INTO #jam (Name)
SELECT SUBSTRING(@Charpool, CONVERT(int, RAND() * @PoolLength), 5)
SET @LoopCount = @LoopCount + 1
END
-- Insert Rows into Second Temp Table
INSERT INTO #wat(Name, Den)
SELECT TOP 50 Name, GETDATE()
FROM #jam
-- Create Indexes
--DROP INDEX IX_jedna ON #jam
--DROP INDEX IX_dva ON #wat
CREATE INDEX IX_jedna ON #jam (Name) INCLUDE (ID);
CREATE INDEX IX_dva ON #wat (Name) INCLUDE (ID, Den);
-- Select
SELECT *
FROM #jam j
JOIN #wat w
ON w.Name = j.Name
実行計画:nested loops, hash match or merge join
(あなたのケース)と別であってもよい:
あなたに与えます。あなたのデータが小さいので、スキャンがうまくいく可能性があります。しかし、統計値が古くなったり、インデックスが失われたりする可能性があります。 –
私はあなたのコードを実行し、インデックスを取得しました。シーク時の推定行数は12でした。コードを繰り返し実行し、推定された行数が10〜15で毎回検索しました。 –
実行しているSQL Serverのバージョンは何ですか? –