Pertanyaan Ungkapan Tarikh: Lebih Pantas dengan Huruf Rentetan
Pertanyaan yang menggunakan ungkapan tarikh dalam keadaannya, seperti yang dilihat dalam contoh berikut, selalunya menunjukkan perlahan prestasi dalam SQL Server 2008:
Where FK.DT = CAST(DATEADD(m, DATEDIFF(m, 0, getdate()), 0) as DATE)
Walau bagaimanapun, telah diperhatikan bahawa menggantikan ungkapan tarikh dengan rentetan literal, seperti '2013-05-01', menghasilkan pelaksanaan pertanyaan yang jauh lebih pantas. Percanggahan ini telah membingungkan ramai pembangun.
Perbezaan prestasi timbul daripada pepijat dalaman dalam SQL Server 2008 yang mempengaruhi cara ia menganggarkan kardinaliti hasil apabila ungkapan tarikh digunakan. Apabila dibentangkan dengan ungkapan tarikh seperti yang terdapat dalam soalan, SQL Server tersilap mengandaikan bahawa ia mewakili nilai malar sepadan dengan tarikh pertama dalam bulan yang ditentukan. Ini membawa kepada anggaran kardinaliti yang tidak tepat, mengakibatkan rancangan pertanyaan yang tidak cekap.
Sebaliknya, menggunakan rentetan literal untuk nilai tarikh, memaksa SQL Server untuk menghadapi nilai sebenar pada masa jalan dan memperoleh anggaran kardinaliti yang lebih tepat. Ini membolehkan pengoptimum menjana pelan pertanyaan yang lebih optimum, yang membawa kepada pelaksanaan yang lebih pantas.
Untuk memintas pepijat ini, seseorang boleh menggunakan ungkapan alternatif berikut:
Where FK.DT = cast(getdate() + 1 - datepart(day, getdate()) as date)
Ungkapan ini mengembalikan pemalar nilai tarikh yang mewakili hari pertama bulan semasa, yang sejajar dengan gelagat pertanyaan yang dimaksudkan. Dengan penggantian ini, pengoptimum boleh menganggarkan kardinaliti dengan tepat dan menghasilkan pelan pertanyaan yang lebih cekap, menyelesaikan kesesakan prestasi yang dikaitkan dengan ungkapan tarikh.
Atas ialah kandungan terperinci Mengapa Pertanyaan Ungkapan Tarikh SQL Server 2008 Lebih Lambat Daripada Pertanyaan Literal Rentetan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!