Saya harus mengakui bahwa saya belum pernah melihat konversi float-float yang ditunjukkan oleh Matt sebelumnya. Saya harus menguji ini.
Saya menguji pilihan murni (yang akan mengembalikan Tanggal dan Waktu, dan bukan yang kami inginkan), solusi yang berkuasa di sini (floor-float), yang umum 'naif' yang disebutkan di sini (stringconvert) dan yang disebutkan di sini bahwa saya menggunakan (seperti yang saya pikir itu yang tercepat).
Saya menguji kueri pada server uji MS SQL Server 2005 yang berjalan pada Server Win 2003 SP2 dengan CPU Xeon 3GHz yang berjalan pada memori maksimal (32 bit, jadi itu sekitar 3,5 Gb). Saat itu malam di mana saya berada sehingga mesin tidak bekerja dengan hampir tanpa beban. Saya memiliki semuanya untuk diri saya sendiri.
Inilah log dari pemilihan uji coba saya dari tabel besar yang berisi stempel waktu yang bervariasi hingga level milidetik. Kumpulan data khusus ini mencakup tanggal yang berkisar lebih dari 2,5 tahun. Tabel itu sendiri memiliki lebih dari 130 juta baris, jadi itu sebabnya saya membatasi hingga satu juta teratas.
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
Waktu penguraian dan kompilasi SQL Server:waktu CPU =0 md, waktu yang berlalu =1 md.
(1000000 baris terpengaruh) Tabel 'tblMeasureLogv2'. Hitungan pindai 1, pembacaan logis 4752, pembacaan fisik 0, pembacaan ke depan 0, pembacaan logika lob 0, pembacaan fisik lob 0, pembacaan ke depan lob pembacaan 0.
Waktu Eksekusi SQL Server:Waktu CPU =422 md, waktu yang berlalu =33803 md.
(1000000 baris terpengaruh) Tabel 'tblMeasureLogv2'. Hitungan pindai 1, pembacaan logis 4752, pembacaan fisik 0, pembacaan ke depan 0, pembacaan logika lob 0, pembacaan fisik lob 0, pembacaan ke depan lob pembacaan 0.
Waktu Eksekusi SQL Server:Waktu CPU =625 md, waktu yang berlalu =33545 md.
(1000000 baris terpengaruh) Tabel 'tblMeasureLogv2'. Hitungan pindai 1, pembacaan logis 4752, pembacaan fisik 0, pembacaan ke depan 0, pembacaan logika lob 0, pembacaan fisik lob 0, pembacaan ke depan lob pembacaan 0.
Waktu Eksekusi SQL Server:Waktu CPU =1953 md, waktu yang berlalu =33843 md.
(1000000 baris terpengaruh) Tabel 'tblMeasureLogv2'. Hitungan pindai 1, pembacaan logis 4752, pembacaan fisik 0, pembacaan ke depan 0, pembacaan logika lob 0, pembacaan fisik lob 0, pembacaan ke depan lob pembacaan 0.
Waktu Eksekusi SQL Server:Waktu CPU =531 md, waktu yang berlalu =33440 md. Waktu penguraian dan kompilasi SQL Server:waktu CPU =0 md, waktu yang berlalu =1 md.
Waktu Eksekusi SQL Server:Waktu CPU =0 md, waktu yang berlalu =1 md.
Apa yang kita lihat di sini?
Mari kita fokus pada waktu CPU (kita sedang melihat konversi), dan kita dapat melihat bahwa kita memiliki angka-angka berikut:
Pure-Select: 422
Floor-cast: 625
String-conv: 1953
DateAdd: 531
Dari sini tampaknya DateAdd (setidaknya dalam kasus khusus ini) sedikit lebih cepat daripada metode pengecoran lantai.
Sebelum Anda pergi ke sana, saya menjalankan tes ini beberapa kali, dengan urutan kueri yang diubah, hasil yang sama.
Apakah ini sesuatu yang aneh di server saya, atau apa?