SQL Server về cơ bản thực hiện các bước sau để thực thi bất kỳ truy vấn (lệnh gọi thủ tục được lưu trữ hoặc câu lệnh SQL đặc biệt):
1) Kiểm tra cú pháp truy vấn
2) nếu ổn - nó kiểm tra bộ đệm của kế hoạch để xem liệu nó đã có kế hoạch thực thi cho truy vấn đó chưa
3) nếu có kế hoạch thực thi - kế hoạch đó là ( re-) được sử dụng và truy vấn được thực thi
4) nếu vẫn chưa có kế hoạch, kế hoạch thực thi được xác định
5) kế hoạch đó được lưu trữ vào bộ đệm kế hoạch để sử dụng lại sau này
6) truy vấn được thực thi
Vấn đề là:SQL đặc biệt và các thủ tục được lưu trữ đều không khác gì .
Nếu một truy vấn SQL đặc biệt đang sử dụng các tham số đúng cách - vì nó vẫn nên làm, để ngăn chặn các cuộc tấn công chèn vào SQL - các đặc điểm hiệu suất của nó không khác biệt và chắc chắn không tệ hơn hơn là thực hiện một thủ tục được lưu trữ.
Thủ tục được lưu trữ có những lợi ích khác (chẳng hạn như không cần cấp cho người dùng quyền truy cập bảng trực tiếp), nhưng về mặt hiệu suất, việc sử dụng các truy vấn SQL đặc biệt được tham số đúng cách cũng hiệu quả tương đương khi sử dụng các thủ tục được lưu trữ.
Cập nhật: sử dụng các thủ tục được lưu trữ qua không tham số hóa truy vấn tốt hơn vì hai lý do chính:
-
vì mỗi truy vấn không được tham số hóa là một mới, khác nhau truy vấn đến SQL Server, nó phải trải qua tất cả các bước xác định kế hoạch thực thi, cho mỗi truy vấn (do đó lãng phí thời gian - và cũng lãng phí không gian bộ nhớ cache của kế hoạch, vì cuối cùng việc lưu trữ kế hoạch thực thi vào kế hoạch bộ đệm ẩn không thực sự hữu ích , vì truy vấn cụ thể đó có thể sẽ không được thực thi lại)
-
các truy vấn không tham số có nguy cơ bị tấn công SQL injection và cần phải tránh bằng mọi giá