sql >> Databasteknik >  >> RDS >> Sqlserver

Mest effektiva sättet i SQL Server att få datum från datum+tid?

Jag måste erkänna att jag inte hade sett golv-flot-omvandlingen som Matt visades förut. Jag var tvungen att testa detta.

Jag testade en ren select (som kommer att returnera datum och tid, och inte är vad vi vill ha), den rådande lösningen här (floor-float), en vanlig "naiv" som nämns här (stringconvert) och den som nämns här som jag var använder (som jag trodde att det var snabbast).

Jag testade frågorna på en testserver MS SQL Server 2005 som körs på en Win 2003 SP2 Server med en Xeon 3GHz CPU som körs på max minne (32 bitar, så det är ungefär 3,5 Gb). Det är natt där jag är så maskinen går på tomgång nästan utan belastning. Jag har allt för mig själv.

Här är loggen från min testkörning som väljer från en stor tabell som innehåller tidsstämplar som varierar ner till millisekundnivå. Denna speciella datauppsättning innehåller datum som sträcker sig över 2,5 år. Själva tabellen har över 130 miljoner rader, så det är därför jag begränsar mig till den översta miljonen.

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

SQL Server-analys och kompileringstid:CPU-tid =0 ms, förfluten tid =1 ms.

(1000000 rad(er) påverkas) Tabell 'tblMeasureLogv2'. Skanningsantal 1, logiskt läser 4752, fysiskt läser 0, read-ahead läser 0, lob logiskt läser 0, lob fysisk läser 0, lob läser framåt läser 0.

SQL Server Execution Times:CPU-tid =422 ms, förfluten tid =33803 ms.

(1000000 rad(er) påverkas) Tabell 'tblMeasureLogv2'. Skanningsantal 1, logiskt läser 4752, fysiskt läser 0, read-ahead läser 0, lob logiskt läser 0, lob fysisk läser 0, lob läser framåt läser 0.

SQL Server Execution Times:CPU-tid =625 ms, förfluten tid =33545 ms.

(1000000 rad(er) påverkas) Tabell 'tblMeasureLogv2'. Skanningsantal 1, logiskt läser 4752, fysiskt läser 0, read-ahead läser 0, lob logiskt läser 0, lob fysisk läser 0, lob läser framåt läser 0.

SQL Server Execution Times:CPU-tid =1953 ms, förfluten tid =33843 ms.

(1000000 rad(er) påverkas) Tabell 'tblMeasureLogv2'. Skanningsantal 1, logiskt läser 4752, fysiskt läser 0, read-ahead läser 0, lob logiskt läser 0, lob fysisk läser 0, lob läser framåt läser 0.

SQL Server Execution Times:CPU-tid =531 ms, förfluten tid =33440 ms. SQL Server-analys och kompileringstid:CPU-tid =0 ms, förfluten tid =1 ms.

SQL Server Execution Times:CPU-tid =0 ms, förfluten tid =1 ms.

Vad är det vi ser här?

Låt oss fokusera på CPU-tiden (vi tittar på konvertering), och vi kan se att vi har följande siffror:

Pure-Select:  422
Floor-cast:   625
String-conv: 1953
DateAdd:      531  

Av detta ser det ut som att DateAdd (åtminstone i det här fallet) är något snabbare än golvgjutningsmetoden.

Innan du åker dit körde jag det här testet flera gånger, med ordningen på frågorna ändrad, samma resultat.

Är detta något konstigt på min server, eller vad?



  1. Analysera I/O-prestanda för SQL Server

  2. Hitta index för senaste förekomsten av en delsträng med T-SQL

  3. Logga in på Microsoft SQL Server Fel:18456

  4. Hitta och ersätt text i hela tabellen med en MySQL-fråga