Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

SQL được tạo động so với các tham số trong SQL Server

Tôi sẽ bỏ qua đối số SQL Injection, đối số này quá nổi tiếng và chỉ tập trung vào khía cạnh SQL của tham số so với không tham số.

Khi bạn gửi một lô SQL đến máy chủ, bất kỳ lô nào, nó phải được phân tích cú pháp để có thể hiểu được. Giống như bất kỳ trình biên dịch nào khác, trình biên dịch SQL phải tạo ra một AST từ văn bản và sau đó hoạt động trên cây cú pháp. Cuối cùng, trình tối ưu hóa chuyển đổi cây cú pháp thành cây thực thi và cuối cùng tạo ra một kế hoạch thực thi và kế hoạch đó thực sự được chạy. Quay trở lại thời kỳ đen tối của khoảng năm 1995, nó đã tạo ra sự khác biệt nếu lô là một truy vấn Ad-Hoc hoặc một thủ tục được lưu trữ, nhưng ngày nay nó hoàn toàn không có, tất cả đều giống nhau.

Bây giờ, nơi các tham số tạo ra sự khác biệt là ứng dụng khách gửi một truy vấn như select * from table where primary_key = @pk sẽ gửi chính xác cùng một văn bản SQL mọi lúc, bất kể giá trị nào được quan tâm. Điều gì xảy ra sau đó là toàn bộ quá trình tôi mô tả ở trên là ngắn mạch. SQL sẽ tìm kiếm trong bộ nhớ một kế hoạch thực thi cho văn bản thô, chưa được phân tích cú pháp nó đã nhận được (dựa trên thông báo băm của đầu vào) và nếu được tìm thấy, sẽ thực hiện kế hoạch đó. Điều đó có nghĩa là không phân tích cú pháp, không tối ưu hóa, không có gì, lô sẽ đi thẳng vào thực thi . Trên các hệ thống OLTP chạy hàng trăm và hàng nghìn yêu cầu nhỏ mỗi giây, đường dẫn nhanh này tạo ra sự khác biệt lớn về hiệu suất.

Nếu bạn gửi truy vấn dưới dạng select * from table where primary_key = 1 thì SQL ít nhất sẽ phải phân tích cú pháp để hiểu những gì bên trong văn bản, vì văn bản có thể là một văn bản mới, khác với bất kỳ lô nào trước đó mà nó đã thấy (ngay cả một ký tự đơn lẻ như 1 so với 2 làm cho toàn bộ lô khác nhau). Sau đó, nó sẽ hoạt động trên cây cú pháp kết quả và thử một quá trình có tên là Tham số đơn giản . Nếu truy vấn có thể được phân quyền tự động, thì SQL có khả năng sẽ tìm thấy một kế hoạch thực thi được lưu trong bộ nhớ cache cho nó từ các truy vấn khác đã chạy trước đó với các giá trị pk khác và sử dụng lại kế hoạch đó, vì vậy ít nhất truy vấn của bạn không cần phải được tối ưu hóa và bạn bỏ qua bước tạo một kế hoạch thực hiện thực tế. Nhưng không có nghĩa là bạn đã đạt được đoạn ngắn mạch hoàn chỉnh, con đường ngắn nhất có thể mà bạn đạt được với một truy vấn được tham số hóa ứng dụng khách thực sự.

Bạn có thể xem xét Máy chủ SQL, Đối tượng thống kê SQL bộ đếm hiệu suất của máy chủ của bạn. Bộ đếm Auto-Param Attempts/sec sẽ hiển thị nhiều lần mỗi giây SQL phải dịch một truy vấn nhận được không có tham số thành một truy vấn được tham số hóa tự động. Mỗi lần thử có thể tránh được nếu bạn tham số hóa đúng cách truy vấn trong ứng dụng khách. Nếu bạn cũng có một số lượng lớn Failed Auto-Params/sec thậm chí còn tệ hơn, nó có nghĩa là các truy vấn đang đi theo chu kỳ đầy đủ của việc tạo kế hoạch tối ưu hóa và thực thi.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm thế nào để nhận được truy vấn nhóm SQL biểu mẫu hàng đầu tiên?

  2. Trả về danh sách các lược đồ phân vùng trong SQL Server (T-SQL)

  3. Cách nhanh nhất để xóa các ký tự không phải số khỏi VARCHAR trong SQL Server

  4. Cách kết hợp kết quả của hai truy vấn thành một tập dữ liệu duy nhất

  5. kết hợp ngày hôm nay và tổng số trước đó từ ngày hôm nay của cùng một cột đó dẫn đến một truy vấn sql