Một truy vấn WHERE sẽ kiểm tra các so sánh đơn giản hơn (ví dụ bit) trước khi chạy các so sánh khó khăn hơn (ví dụ varchar)?


12

Nếu tôi viết một truy vấn bao gồm WHEREmệnh đề ghép , vd:

SELECT *
FROM MyTable
WHERE BitField = 1
    AND VarcharField = 'asdf'

và việc đưa vào bitso sánh đó chỉ đơn giản là loại trừ các trường tương tự mà varcharso sánh sẽ loại trừ, liệu sự hiện diện của bitso sánh trường đó có cho tôi một cải tiến hiệu suất không?

Câu trả lời:


22

Điều quan trọng là phải nhận ra rằng SQL là một ngôn ngữ khai báo. CácSELECT truy vấn mà bạn đã viết quy định cụ thể những kết quả hợp lý rằng nên được trả lại. Tùy thuộc vào công cụ cơ sở dữ liệu, cụ thể là trình tối ưu hóa truy vấn, để xác định chiến lược vật lý hiệu quả để trả về các kết quả đó.

Kế hoạch thực hiện vật lý cuối cùng sẽ phụ thuộc vào khả năng suy luận của trình tối ưu hóa, lượng thời gian chuẩn bị dành cho vấn đề, tính sẵn có của các phương thức truy cập phù hợp (chủ yếu là chỉ mục và quan điểm cụ thể hóa), thông tin thống kê đại diện và đường dẫn mã cụ thể của bạn đặc tả truy vấn sẽ thông qua mã tối ưu hóa.

Nói chung, nếu thiết kế cơ sở dữ liệu của bạn là quan hệ, bạn cung cấp các phương thức truy cập tốt và thông tin thống kê chính xác và truy vấn được viết tốt, trình tối ưu hóa thường sẽ tìm thấy một chiến lược thực thi vật lý hợp lý mà bạn không cần phải lo lắng quá nhiều về hình thức viết đặc tả truy vấn quá nhiều.

Sẽ luôn có trường hợp diễn đạt cùng một yêu cầu logic bằng cách sử dụng cú pháp khác nhau (nhưng giống hệt nhau về mặt ngữ nghĩa) sẽ ảnh hưởng đến kế hoạch thực hiện vật lý, nhưng đó phải là mối quan tâm thứ yếu. Một lần nữa, nói chung, chỉ xem xét việc thể hiện truy vấn khác nhau nếu các đặc điểm thời gian chạy không được chấp nhận, một khi tất cả các điều cơ bản được đề cập ở trên đã được đề cập.

Nó sẽ là hiếm trong cực đoan cho thứ tự viết kết hợp đơn giản WHERE vị từ mệnh đề (như trong câu hỏi) ảnh hưởng đến kế hoạch thực hiện vật lý theo bất kỳ cách nào có thể đo lường được. Nói tóm lại, đây không phải là điều bạn nên dành thời gian lo lắng. Nhận thiết kế cơ sở dữ liệu, chỉ mục và thông tin thống kê ngay trước tiên.

Để trả lời câu hỏi trực tiếp (cuối cùng!), Thêm điều kiện dư thừa có thể cải thiện hiệu suất, nhưng chỉ khi nó cho phép sử dụng phương thức truy cập hiệu quả hơn - ví dụ: nếu chỉ có một chỉ mục trên (BitField, VarcharField). Nếu đã có một chỉ mục trên (VarcharField), nó sẽ chỉ thêm chi phí.

Là một chi tiết triển khai, không, SQL Server không xem xét chi phí so sánh tùy thuộc vào loại dữ liệu hoặc độ phức tạp tính toán rõ ràng. Trong thực tế, có rất ít chi phí của các hoạt động vô hướng , nhưng điều đó dẫn đến một chủ đề hoàn toàn riêng biệt.

Câu hỏi liên quan:

Toán tử logic HOẶC VÀ trong điều kiện và thứ tự các điều kiện trong WHERE
SQL Server 2008 và các biểu thức không đổi
Toán tử bitwise ảnh hưởng đến hiệu suất
Hành vi câu lệnh SQL lạ


5

Phân vùng nhị phân (như cột bit) nghe có vẻ là ứng cử viên tốt cho các chỉ mục được lọc.

CREATE NONCLUSTERED INDEX MyTableWithBitFieldTrue
ON MyTable (VarcharField)
INCLUDE Id, <other columns you're selecting>
WHERE BitField = 1 ;
GO

Rõ ràng về tối ưu hóa của bạn có nghĩa là mã của bạn mạnh mẽ hơn xung quanh các thay đổi của người khác, cho dù trong cơ sở mã của bạn hoặc trong SQL Server.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.