2011-11-14 21 views
7

Tôi đang sử dụng SQL Server 2008. Tôi có chỉ mục Non-Unique Non-clustered trên cột DateTime "DateFrom". Tôi đang tìm kiếm bảng dựa trên cột này. Tôi chỉ muốn biết ảnh hưởng của CONVERT() chức năng trên INDEX xem dưới đây:Ảnh hưởng của CONVERT() trên INDEX khi tìm kiếm là gì?

Query1: 
SELECT * 
FROM myTable 
WHERE CONVERT(VARCHAR(10),DateFrom,23) >= '2011-01-01' 

Query2: 
SELECT * 
FROM myTable 
WHERE DateFrom >= '2011-01-01 00:00:00.000' 

Tôi đã kiểm tra & không tìm thấy sự khác biệt. Nhưng tôi đã nghĩ rằng kể từ khi cột được chuyển đổi, do đó, chỉ số có thể không được sử dụng bởi SQL Server, là nó chính xác?

Hãy tha thứ cho tôi nếu đây không phải là câu hỏi thích hợp.

+0

o.DateFrom - không có bí danh nào cho typo o-nhẹ? – Andrew

+0

* Tôi đã kiểm tra và thấy không có sự khác biệt * - bạn có nói rằng bạn thực sự đã so sánh các kế hoạch thực hiện và thấy chúng giống hệt nhau không? Tôi nghi ngờ điều đó; truy vấn đầu tiên so sánh các chuỗi sử dụng quy tắc cho chuỗi, thứ hai so sánh ngày tháng. – GSerg

+0

Nếu bạn đang vào năm 2008 và truyền 'datetime' thành' date', nó vẫn có thể sử dụng một chỉ mục nhưng điều này là rất nhiều ngoại lệ cho quy tắc. –

Trả lời

10

Nói chung, khi bạn có một hàm ở bên trái của so sánh trong mệnh đề WHERE, máy chủ sẽ không thể sử dụng chỉ mục trên cột được tham chiếu.

Trong ví dụ đầu tiên của bạn, không có so sánh trực tiếp với cột DateFrom. Thay vào đó, bạn đang sử dụng một hàm trên cột. Khi máy chủ mở rộng, nó phải thực hiện chức năng trên mỗi giá trị cột, và giá trị kết quả không được lập chỉ mục. Do đó, không chỉ mục nào có thể được sử dụng để cải thiện truy vấn.

Ngoài ra, trong ví dụ đầu tiên của bạn, bạn đã chỉ ra rằng cột DateFrom là cột ngày giờ. Tuy nhiên, bạn đang chuyển đổi cột thành chuỗi và thực hiện so sánh chuỗi. Do đó, máy chủ sẽ không sử dụng chỉ mục datetime của bạn.

Trong ví dụ thứ hai, bạn đang so sánh giá trị không đổi với cột ngày trực tiếp, vì vậy máy chủ có thể sử dụng chỉ mục. Máy chủ sẽ chuyển đổi hằng số chuỗi ở bên phải của so sánh thành giá trị ngày giờ. Tuy nhiên, nó sẽ không sử dụng chỉ mục trong mọi trường hợp. Ví dụ: nếu bạn có rất ít hàng, máy chủ có thể quyết định không sử dụng chỉ mục và chỉ quét vài hàng.

Cả hai truy vấn đều có thể mang lại cùng một tập kết quả, nhưng chúng vẫn rất khác nhau.

+0

Cảm ơn, hãy để tôi thử nó trên dữ liệu lớn. –

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