Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Kueri berjalan lambat dengan ekspresi tanggal, tetapi cepat dengan string literal

Ini bisa bekerja lebih baik:

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

Kecuali Anda menjalankan dengan trace flag 4199 di sana bug yang mempengaruhi perkiraan kardinalitas. Pada saat penulisan

SELECT DATEADD(m, DATEDIFF(m, getdate(), 0), 0), 
       DATEADD(m, DATEDIFF(m, 0, getdate()), 0)

Pengembalian

+-------------------------+-------------------------+
| 1786-06-01 00:00:00.000 | 2013-08-01 00:00:00.000 |
+-------------------------+-------------------------+

Bugnya adalah bahwa predikat dalam pertanyaan menggunakan tanggal pertama daripada tanggal kedua saat menurunkan perkiraan kardinalitas. Jadi untuk pengaturan berikut.

CREATE TABLE FK
(
ID INT IDENTITY PRIMARY KEY,
DT DATE,
Filler CHAR(1000) NULL,
UNIQUE (DT,ID)
)

INSERT INTO FK (DT)
SELECT TOP (1000000) DATEADD(m, DATEDIFF(m, getdate(), 0), 0)
FROM master..spt_values o1, master..spt_values o2
UNION ALL
SELECT               DATEADD(m, DATEDIFF(m, 0, getdate()), 0)

Kueri 1

SELECT COUNT(Filler)
FROM FK
WHERE FK.DT = CAST(DATEADD(m, DATEDIFF(m, 0, getdate()), 0) AS DATE)  

Memperkirakan bahwa jumlah baris yang cocok akan menjadi 100.000. Ini adalah nomor yang cocok dengan tanggal '1786-06-01' .

Tapi kedua pertanyaan berikut

SELECT COUNT(Filler)
FROM FK
WHERE FK.DT = CAST(GETDATE() + 1 - DATEPART(DAY, GETDATE()) AS DATE)

SELECT COUNT(Filler)
FROM FK
WHERE FK.DT = CAST(DATEADD(m, DATEDIFF(m, 0, getdate()), 0) AS DATE)  
OPTION (QUERYTRACEON 4199)

Berikan rencana ini

Karena perkiraan kardinalitas yang jauh lebih akurat, rencana tersebut sekarang hanya melakukan pencarian indeks tunggal daripada pemindaian penuh.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL - Bagaimana cara menyimpan dan menavigasi hierarki?

  2. Adakah cara untuk menyisipkan atau memperbarui SQLBulkCopy jika ada?

  3. Salin data ke dan dari tabel yang sama dan ubah nilai data yang disalin dalam satu kolom ke nilai yang ditentukan

  4. Cara memanggil prosedur tersimpan dengan SQLAlchemy yang memerlukan parameter Tabel tipe yang ditentukan pengguna

  5. Cara mendapatkan Kuartal kalender dari tanggal di TSQL