2015-05-27 16 views
5

Tôi có cột ngày trên bảng SQL Server được gọi là dd.Sự khác biệt về hiệu suất trong SQL

dd 
--------------------------- 
10-01-2015 00:00:00.000 
22-05-2015 10:22:32.521 
27-05-2015 12:30:48.310 
24-12-2014 09:51:11.728 
27-05-2015 02:05:40.775 
.... 

Tôi cần truy xuất tất cả các hàng có giá trị dd trong 24 giờ qua.

tôi thấy 3 lựa chọn cho việc lọc để có được kết quả cần thiết:

1. `dd >= getdate() - 1` 
2. `dd >= dateadd(day, -1, getdate()) 
3. `dateadd(day, 1, dd) >= getdate() 

Câu hỏi của tôi là: Có phải tất cả 3 tùy chọn này sẽ lấy tất cả các hàng tôi cần?
Nếu có sự khác biệt nào giữa chúng?

+6

# 3 là điều tồi tệ nhất bạn có thể làm! – JimmyB

+1

Bạn đã xem các kế hoạch thực hiện chưa? –

+0

# 1 và # 2 giống hệt nhau, trong đó # 1 chỉ là ký hiệu viết tắt của MS-SQL cho # 2. Tôi muốn sử dụng # 2 mặc dù, bởi vì nó dường như truyền đạt rõ ràng hơn cho người đọc những gì đơn vị đang được thêm vào. – JimmyB

Trả lời

7
  1. dd >= getdate() - 1

Đây là một cái gì đó giống như một hack, nhưng nó hoạt động, nhưng đôi khi nó có thể dẫn đến sai sót (http://www.devx.com/dbzone/Article/34594/0/page/2).

  1. dd >= dateadd(day, -1, getdate())

Đây là cách tiêu chuẩn làm việc.

  1. dateadd(day, 1, dd) >= getdate()

này cũng sẽ làm việc nhưng có một NO. Nó sẽ không sử dụng chỉ mục nếu bất kỳ chỉ mục nào được tạo trên cột đó. Bởi vì nó không phải là Search Argument (What makes a SQL statement sargable?). Khi bạn áp dụng một biểu thức cho một số cột, nó sẽ trở thành không SARG và sẽ không sử dụng bất kỳ chỉ mục nào.

Tất cả 3 phiên bản sẽ tạo ra kết quả tương tự, nhưng trước tiên là hack và trong một số trường hợp sẽ dẫn đến lỗi. Thứ ba sẽ không sử dụng chỉ mục. Vì vậy, rõ ràng là một trong những nên dính vào tùy chọn 2.

4

Đầu tiên hai là chính xác như Giorgi nói, nhưng trên thứ ba, Index Index của bạn sẽ trở thành Index Scan. SQL Server sẽ vẫn sử dụng chỉ mục đó nhưng nó không còn có thể nhảy tới bản ghi cụ thể mà thay vào đó nó phải quét nó để tìm những gì nó cần.

Với mục đích minh họa, tôi đã chọn bảng có cột DATETIME được lập chỉ mục và chỉ chọn cột đó để tránh bất kỳ tra cứu chính nào và để giữ cho kế hoạch đơn giản.

enter image description here

Ngoài ra hãy xem tại đọc trên bàn và ước tính vs đếm hàng trả lại. Ngay sau khi bạn bọc cột trong một hàm, nó không thể ước tính số hàng chính xác sẽ gây ra các vấn đề hiệu suất lớn khi các truy vấn trở nên phức tạp hơn.

enter image description here

Các vấn đề liên quan