Chúng tôi có nhiều "thủ tục lưu trữ tìm kiếm" lấy nhiều tham số nullable để tìm kiếm các hàng dữ liệu trong các bảng khác nhau. Chúng thường được xây dựng như thế này:T-SQL - Không sử dụng kế hoạch tối ưu - Mệnh đề WHERE nên được cắt ngắn
SELECT *
FROM Table1 T1
INNER JOIN Table2 T2
ON T2.something = T1.something
WHERE (@parameter1 IS NULL OR T1.Column1 = @parameter1)
AND (@parameter2 IS NULL OR T2.Column2 = @parameter2)
AND (@parameter3 IS NULL OR T1.Column3 LIKE '%' + @parameter3 + '%')
AND (@parameter4 IS NULL OR T2.Column4 LIKE '%' + @parameter4 + '%')
AND (@parameter5 IS NULL OR T1.Column5 = @parameter5)
Điều này có thể tiếp tục cho đến 30-40 thông số và những gì chúng tôi nhận thấy ngay cả khi chỉ có tham số1, kế hoạch thực hiện quét qua chỉ mục của bảng có thể làm chậm truy vấn đáng kể (vài giây). Các thử nghiệm cho chúng ta thấy rằng chỉ giữ dòng đầu tiên từ câu lệnh WHERE làm cho truy vấn ngay lập tức.
Tôi đã đọc shortcuiting là không thể, nhưng có cách nào hay cách để xây dựng các truy vấn có thể hiệu quả hơn? Chúng tôi hiện đang giải quyết vấn đề này bằng cách có các phiên bản khác nhau của cùng một SELECT/FROM/JOINS nhưng với các tham số khác nhau trong mệnh đề WHERE và tùy thuộc vào thông số nào được thông qua, chúng tôi chọn câu lệnh chọn thích hợp để thực hiện. Điều này là dài, lộn xộn và khó duy trì.
Bạn đã cân nhắc sử dụng [SQL động] (http://www.sommarskog.se/dynamic_sql.html) chưa? Ngay cả với [SQL Injection] (http://en.wikipedia.org/wiki/SQL_injection) báo trước nó có thể phù hợp hơn với nhu cầu của bạn. – Oded
Xây dựng sql động và sql tiêm tham số không phải là một vấn đề – StrayCatDBA
Tôi sẽ xem lại tại sql động, nhưng có vẻ như chỉ cần quay trở lại cách chúng ta sử dụng để làm việc và xây dựng các chuỗi mã SQL phức tạp bên trong ứng dụng một loạt các điều kiện làm cho nó gần như không thể hiểu được truy vấn trong nháy mắt. Ngoài ra có cách nào để giữ nổi bật/công cụ cú pháp trong SQL studio quản lý cho các truy vấn đó không? – FrancoisCN