Chúng tôi sử dụng quy trình này rất hạn chế trong các thủ tục được lưu trữ.
Vấn đề là công cụ cơ sở dữ liệu không thể giữ một kế hoạch truy vấn tốt cho nó. Khi xử lý nhiều dữ liệu, điều này có thể có tác động tiêu cực nghiêm trọng về hiệu suất.
Tuy nhiên, đối với các tập dữ liệu nhỏ hơn (tôi muốn nói dưới 1000 bản ghi, nhưng đó là phỏng đoán) nó sẽ ổn. Bạn sẽ phải thử nghiệm trong môi trường cụ thể của bạn.
Nếu trong quy trình được lưu trữ, bạn có thể muốn bao gồm thứ gì đó như tùy chọn WITH RECOMPILE
sao cho số plan is regenerated on each execution. Điều này cho biết thêm (hơi) đến thời gian cho mỗi lần chạy, nhưng qua một số lần chạy có thể thực sự làm giảm thời gian thực hiện trung bình. Ngoài ra, điều này cho phép cơ sở dữ liệu kiểm tra truy vấn thực tế và "short circuit" các phần không cần thiết trên mỗi cuộc gọi.
Nếu bạn đang trực tiếp tạo SQL và chuyển nó qua, thì tôi khuyên bạn nên tạo phần xây dựng sql của bạn thông minh hơn một chút để nó chỉ bao gồm một phần của mệnh đề where bạn thực sự cần.
Đường dẫn khác bạn có thể xem xét là sử dụng UNION TẤT CẢ các truy vấn trái ngược với tham số tùy chọn. Ví dụ:
SELECT * FROM Teacher WHERE (TeacherId = @TeacherID)
UNION ALL
SELECT * FROM Teacher WHERE (@TeacherId = -1)
Điều này thực sự hoàn thành điều tương tự; tuy nhiên, kế hoạch truy vấn có thể lưu vào bộ nhớ cache. Chúng tôi cũng đã sử dụng phương pháp này ở một vài nơi và thấy các cải tiến hiệu suất khi sử dụng WITH RECOMPILE. Chúng tôi không làm điều này ở khắp mọi nơi bởi vì một số truy vấn của chúng tôi vô cùng phức tạp và tôi muốn có hiệu suất hơn là làm phức tạp thêm chúng.
Cuối cùng, bạn cần thực hiện nhiều thử nghiệm.
Có phần thứ hai ở đây bạn nên xem xét lại. SELECT *
. It is ALWAYS preferable to actually name the columns you want returned và để đảm bảo rằng bạn đang chỉ trả lại những thứ bạn thực sự cần. Di chuyển dữ liệu qua các ranh giới mạng là rất tốn kém và bạn thường có thể nhận được một số tiền hợp lý về tăng hiệu suất chỉ đơn giản bằng cách xác định chính xác những gì bạn muốn. Ngoài ra nếu những gì bạn cần là rất hạn chế bạn đôi khi có thể làm covering indexes để các công cụ cơ sở dữ liệu thậm chí không phải chạm vào các bảng bên dưới để có được dữ liệu bạn muốn.
George, bạn không thể hình dung được câu hỏi của mình 'nóng' như thế nào. Bạn vừa tạo ra một kết hợp tuyệt vời của 'thực hành tốt nhất' và 'SQL' trong một câu hỏi duy nhất. Đã thêm +1, sẽ thêm +100 nếu tôi có thể. –
Tôi thường viết hai truy vấn riêng biệt theo đề xuất của @Jeff O. Ngoài ra, bạn có thể muốn đọc về tham số sniffing. SQL động và RECOMPILE có thể đắt hơn trong trường hợp này - chúng tôi chỉ có hai trường hợp riêng biệt. –