7

Comments để question "How to decrease response time of a simple select query?" tell:Tại sao chỉ mục không có khả năng làm nhiều nếu là DATETIME hoặc DATETIME2 vì chúng bao gồm phần thời gian?

  • "? Kiểu dữ liệu trên LaunchDate là gì Một chỉ số là không có khả năng làm được gì nhiều nếu nó là DATETIME hoặc DATETIME2 vì chúng bao gồm phần thời gian - OMG Ngựa Non"

  • "@OMG - Tại sao một chỉ mục nhóm trên cột DateTime không cải thiện hiệu suất? Truy vấn là quét phạm vi cho phép tìm kiếm chỉ mục phạm vi nhanh vì tất cả dữ liệu sẽ nằm trong khối tuần tự? Liên quan đến bán ... msdn.microsoft.com/en-us/library/ms177416.aspx - Calgary Coder "

  • "Calgary Coder: DATETIME/2 bao gồm thời gian - chỉ mục, được nhóm hoặc không được nhóm, sẽ tốt cho các ngày có thời gian trùng lặp nhưng không nằm trong phạm vi. - OMG Ngựa Non"

Tôi tạo ra một bảng thử nghiệm với nhóm chỉ số trên DATETIME loại cột LaunchDate và quan sát chỉ số tìm kiếm cho các truy vấn tương tự được trích dẫn trong câu hỏi trên:

SELECT COUNT(primaryKeyColumn) 
FROM MarketPlan 
WHERE LaunchDate > @date 

thay vì bảng hoặc chỉ số quét .

Tại sao một chỉ mục nhóm trên cột DateTime cải thiện hiệu suất?
Tại sao chỉ mục không có khả năng làm được nhiều nếu đó là DATETIME hoặc DATETIME2 vì chúng bao gồm phần thời gian?

Tôi đánh giá cao kịch bản minh họa việc lập chỉ mục của cột DATETIME không cải thiện hiệu suất.

Cập nhật: Ngoài ra, OMG có ngụ ý rằng chỉ mục trên cột DATE sẽ hữu ích nhưng không phải là DATETIMEDATETIME2?

+3

Tôi nghĩ OMG đã sai trong trường hợp này. ** Việc lập chỉ mục phải hữu ích **. –

+0

Phạm vi * lần một mình * (ví dụ: 8: 00–10: 00) sẽ không được cải thiện bởi chỉ mục khi có nhiều ngày trong cột. Nhưng điều đó không thực sự có vẻ là những gì anh ta nói về. Tôi không có ý kiến. –

+0

Đó là những gì tôi nhận được vì không khóa máy trạm của tôi:/ –

Trả lời

3

Tôi đã đọc các câu hỏi khác, không có ý tưởng gì OMG ngựa nghĩa

3 điểm:

  • Nó không nên quan trọng nếu một chỉ số được nhóm hoặc non-clustered:
  • Bất kể thời gian có được bao gồm quá
  • Nó chỉ hữu ích

Seek hoặc quét:

Dựa trên thống kê, nếu LaunchDate > @date phương tiện, nói rằng, 90% các hàng, sau đó rất có thể quét sẽ xảy ra. Nếu nó là khá chọn lọc, sau đó một tìm kiếm có nhiều khả năng.

Bất kể phân cụm hoặc không được nhóm lại!

Chỉ mục nào?

Một truy vấn như thế này sẽ đòi hỏi một chỉ mục trên LaunchDate và primaryKeyColumn

SELECT COUNT(primaryKeyColumn) 
FROM MarketPlan 
WHERE LaunchDate > @date 

Bây giờ, bất kỳ chỉ số không clustered đề cập đến các chỉ số nhóm mà được giả định là PK theo mặc định. Vì vậy, primaryKeyColumn hoàn toàn được bao gồm.

Superstition

Tuy nhiên, COUNT(primaryKeyColumn)is a superstition. Bởi vì PKS không cho phép NULL, nó tương đương với

SELECT COUNT(*) 
FROM MarketPlan 
WHERE LaunchDate > @date 

SELECT COUNT(1) 
FROM MarketPlan 
WHERE LaunchDate > @date 

Vì vậy, bạn chỉ cần một chỉ mục trên LaunchDate, cho dù nhóm hoặc non-clustered

+0

Trong bảng như vậy với 10 hàng dữ liệu (và 5 cột) tôi quan sát Clustered Index Tìm kiếm nếu LaunchDate> @date có nghĩa là, nói rằng, bất kỳ số lượng hàng 0%, 10%, 20%, 30%, 90%, 100% –

+0

@ vgv8: 10 hàng là lạc, bạn cần 10k hàng Như tôi đã nói, đó là cách hữu ích của chỉ mục, chứ không phải là C hoặc NC. cần sử dụng primaryKeyColumn để đơn giản hóa chỉ mục – gbn

+0

Tại sao/cách primaryKeyColumn đơn giản hóa chỉ mục? –

0

Index trên một cột ngày sẽ không được sử dụng nếu sử dụng ứng dụng của bạn datetime gây ra chuyển đổi kiểu dữ liệu ngầm định. Nếu bạn nhìn vào kế hoạch thực thi, bạn có thể thấy rằng có một hàm bên trong được áp dụng cho một cột. Giải pháp thay đổi cột ngày thành dấu thời gian (4) hoặc điều chỉnh ứng dụng khách để sử dụng ngày thay vì ngày giờ.

+0

Tôi không biết gì không bạn đang nói về ở đây, nhưng kiểu dữ liệu 'timestamp' duy nhất được định nghĩa cho SQL Server (mà câu hỏi này được gắn thẻ) không có gì để làm với ngày giờ. –

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