Index vs. table scan
Jeg har følgende batch:DECLARE
@Latest CHAR (12),
@D CHAR(6), -- Dato
@T CHAR(6) -- Tid
SET @Latest = '030225150237'
SET @D = substring(@Latest,1,6)
SET @T = substring(@Latest,7,6)
select * FROM dbo.Li_data WHERE (DATO >= @D) AND (Tid >= @T)
Jeg har oprettet et index (IX_Li_Data_1) i tabellen LI_data på DATO, TID.
Sp. 1:
Er der der nogen der forklare hvorfor ovenstående batch udfører en table scan og ikke bruger index?
Følgende *bruger* index og kører derfor *meget* hurtigere:
select * from dbo.Li_data WHERE
(DATO >= '030225') AND (TID >= '150237')
Jeg behøver vel ikke at sige at de 2 batches returnerer præcis det samme.
Sp. 2:
Den første gang jeg kører batchen (den langsomme) gik der ca. 1 min. (ca. 2000 poster) næste gang tog det ca. 12 sek. 3. og efterfølgende forsøg tager ca. 2 sek.
Hvordan f..... hænger det lige sammen?
Her ses execution plan for de 2 forskellige statements som viser at den første bruger table scan og den næste bruger indexet.
StmtText
-------------------------------------------------------------------------------------------------------
DECLARE
@Latest CHAR (12),
@D CHAR(6), -- Dato
@T CHAR(6) -- Tid
SET @Latest = '030225150237'
SET @D = substring(@Latest,1,6)
SET @T = substring(@Latest,7,6)
select * from dbo.Li_data WHERE (DATO >= '030225') AND (TID >= '150237')
(4 row(s) affected)
StmtText
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|--Bookmark Lookup(BOOKMARK:([Bmk1000]), OBJECT:([lidata0].[dbo].[Li_Data]))
|--Index Seek(OBJECT:([lidata0].[dbo].[Li_Data].[IX_Li_Data_1]), SEEK:(([Li_Data].[DATO], [Li_Data].[TID]) >= (Convert([@1]), Convert([@2]))), WHERE:([Li_Data].[TID]>=Convert([@2])) ORDERED FORWARD)
(2 row(s) affected)
StmtText
------------------------------------------------------------------
select * FROM dbo.Li_data WHERE (DATO >= @D) AND (Tid >= @T)
(1 row(s) affected)
StmtText
--------------------------------------------------------------------------------------------------------------------------------
|--Table Scan(OBJECT:([lidata0].[dbo].[Li_Data]), WHERE:([Li_Data].[DATO]>=Convert([@D]) AND [Li_Data].[TID]>=Convert([@T])))
(1 row(s) affected)
