Musím přiznat, že přestavbu podlahy-plovoucí, kterou ukázal Matt, jsem ještě neviděl. Tohle jsem musel otestovat.
Testoval jsem čistý výběr (který vrátí datum a čas a není to, co chceme), zde vládnoucí řešení (floor-float), běžné „naivní“ zde uvedené (stringconvert) a zde uvedené, že jsem byl pomocí (jak jsem si myslel, že to bylo nejrychlejší).
Dotazy jsem testoval na testovacím serveru MS SQL Server 2005 běžícím na serveru Win 2003 SP2 Server s procesorem Xeon 3GHz běžícím na maximální paměti (32 bitů, takže to je asi 3,5 Gb). Tam, kde jsem, je noc, takže stroj běží na volnoběh téměř bez zatížení. Mám to všechno pro sebe.
Zde je protokol z mého testovacího běhu, který vybírá z velké tabulky obsahující časová razítka v řádu milisekund. Tento konkrétní soubor dat obsahuje data v rozmezí více než 2,5 roku. Samotná tabulka má více než 130 milionů řádků, proto se omezuji na horní milion.
SELECT TOP 1000000 CRETS FROM tblMeasureLogv2
SELECT TOP 1000000 CAST(FLOOR(CAST(CRETS AS FLOAT)) AS DATETIME) FROM tblMeasureLogv2
SELECT TOP 1000000 CONVERT(DATETIME, CONVERT(VARCHAR(10), CRETS, 120) , 120) FROM tblMeasureLogv2
SELECT TOP 1000000 DATEADD(DAY, DATEDIFF(DAY, 0, CRETS), 0) FROM tblMeasureLogv2
Čas analýzy a kompilace serveru SQL Server:čas CPU =0 ms, uplynulý čas =1 ms.
(1000000 ovlivněných řádků) Tabulka 'tblMeasureLogv2'. Počet skenů 1, logické čtení 4752, fyzické čtení 0, čtení napřed 0, logické čtení 0, fyzické čtení 0, lob čtení napřed 0.
SQL Server Execution Times:CPU time =422 ms, uplynulý čas =33803 ms.
(1000000 ovlivněných řádků) Tabulka 'tblMeasureLogv2'. Počet skenů 1, logické čtení 4752, fyzické čtení 0, čtení napřed 0, logické čtení 0, fyzické čtení 0, lob čtení napřed 0.
SQL Server Execution Times:CPU time =625 ms, uplynulý čas =33545 ms.
(1000000 ovlivněných řádků) Tabulka 'tblMeasureLogv2'. Počet skenů 1, logické čtení 4752, fyzické čtení 0, čtení napřed 0, logické čtení 0, fyzické čtení 0, lob čtení napřed 0.
SQL Server Execution Times:Čas CPU =1953 ms, uplynulý čas =33843 ms.
(1000000 ovlivněných řádků) Tabulka 'tblMeasureLogv2'. Počet skenů 1, logické čtení 4752, fyzické čtení 0, čtení napřed 0, logické čtení 0, fyzické čtení 0, lob čtení napřed 0.
SQL Server Execution Times:CPU time =531 ms, uplynulý čas =33440 ms. Čas analýzy a kompilace serveru SQL Server:čas CPU =0 ms, uplynulý čas =1 ms.
SQL Server Execution Times:CPU time =0 ms, uplynulý čas =1 ms.
Co tady vidíme?
Zaměřme se na čas procesoru (díváme se na převod) a vidíme, že máme následující čísla:
Pure-Select: 422
Floor-cast: 625
String-conv: 1953
DateAdd: 531
Z toho se mi zdá, že DateAdd (alespoň v tomto konkrétním případě) je o něco rychlejší než metoda floor-cast.
Než tam půjdete, provedl jsem tento test několikrát, přičemž pořadí dotazů se změnilo, výsledky jsou stejné.
Je to na mém serveru něco divného nebo co?