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
Lepaskan: 2024-12-18 17:03:13
asal
948 orang telah melayarinya

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)
Salin selepas log masuk

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)
Salin selepas log masuk

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)
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan