Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Truy vấn chạy chậm với biểu thức ngày tháng, nhưng nhanh với chuỗi ký tự

Điều này có thể hoạt động tốt hơn:

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

Trừ khi bạn đang chạy với cờ theo dõi 4199 trên đó có một lỗi điều đó ảnh hưởng đến ước tính bản số. Tại thời điểm viết bài

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

Trả lại

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

Lỗi là vị từ trong câu hỏi sử dụng ngày đầu tiên thay vì ngày thứ hai khi tính toán số lượng ước tính. Vì vậy, đối với thiết lập sau.

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)

Truy vấn 1

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

Ước tính số hàng phù hợp sẽ là 100.000. Đây là số khớp với ngày '1786-06-01' .

Nhưng cả hai truy vấn sau đây

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)

Đưa ra kế hoạch này

Do ước tính bản số chính xác hơn nhiều, kế hoạch hiện chỉ thực hiện một chỉ mục duy nhất tìm kiếm thay vì quét toàn bộ.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. cách đơn giản nhất để thực hiện tải tệp văn bản định kỳ lên máy chủ sql

  2. T-SQL:vấn đề với chuỗi nối

  3. Tắt các ràng buộc tạm thời (MS SQL)

  4. Cách tạo Ngày trong SQL Server với Ngày, Tháng và Năm dưới dạng Số nguyên

  5. Giao diện mạng SQL Server:Chuỗi kết nối không hợp lệ [87]