Rumah >pangkalan data >tutorial mysql >Mengapa Pertanyaan SQL Server 2008 Saya Lambat Apabila Menggunakan Ungkapan DateTime dalam Klausa WHERE?

Mengapa Pertanyaan SQL Server 2008 Saya Lambat Apabila Menggunakan Ungkapan DateTime dalam Klausa WHERE?

Barbara Streisand
Barbara Streisandasal
2024-12-18 17:03:13926semak imbas

Why is My SQL Server 2008 Query Slow When Using DateTime Expressions in the WHERE Clause?

Percanggahan Prestasi Pertanyaan dengan Ungkapan DateTime

Pertanyaan yang mengalami kelembapan ketara apabila menggunakan ungkapan tarikh dalam klausa WHERE berbanding dengan nilai literal rentetan menimbulkan dilema prestasi pertanyaan. Mari kita mendalami isu ini dan dapatkan penyelesaian.

Punca Punca

Jurang prestasi timbul disebabkan oleh pepijat dalam SQL Server 2008, yang menjejaskan anggaran kardinaliti apabila menggunakan ungkapan tarikh dalam klausa MANA. Pepijat mengakibatkan anggaran bilangan baris yang sepadan yang salah.

Pertanyaan Dioptimumkan

Untuk memintas pepijat ini, pertanyaan dioptimumkan berikut dicadangkan:

Where FK.DT = cast(getdate() + 1 - datepart(day, getdate()) as date)

Ungkapan ini mengembalikan permulaan bulan semasa, yang mungkin merupakan kriteria pemilihan yang diingini dalam hal ini senario.

Bendera Surih 4199

Sebagai alternatif, bendera surih 4199 boleh didayakan untuk memaksa anggaran kardinaliti yang tepat. Dengan bendera surih 4199 dihidupkan, pertanyaan berikut juga akan menghasilkan pelan yang diingini:

Where FK.DT = CAST(DATEADD(m, DATEDIFF(m, 0, getdate()), 0) as DATE)  
OPTION (QUERYTRACEON 4199)

Contoh

Sebagai contoh, dengan jadual yang dipanggil FK mengandungi lajur yang dipanggil DT dengan nilai yang mewakili permulaan setiap bulan, dua pertanyaan berikut menunjukkan percanggahan prestasi:

-- Slow due to incorrect cardinality estimates
SELECT COUNT(Filler)
FROM FK
WHERE FK.DT = CAST(DATEADD(m, DATEDIFF(m, 0, getdate()), 0) AS DATE)  

-- Fast due to accurate cardinality estimates with trace flag 4199
SELECT COUNT(Filler)
FROM FK
WHERE FK.DT = CAST(DATEADD(m, DATEDIFF(m, 0, getdate()), 0) AS DATE)  
OPTION (QUERYTRACEON 4199)

Dengan bendera surih 4199 didayakan, pertanyaan kedua akan menghasilkan masa pelaksanaan yang jauh lebih pantas disebabkan oleh pelan pertanyaan yang dioptimumkan.

Atas ialah kandungan terperinci Mengapa Pertanyaan SQL Server 2008 Saya Lambat Apabila Menggunakan Ungkapan DateTime dalam Klausa WHERE?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn