Hiệu quả của các thủ tục được lưu trữ so với các truy vấn thô


23

Tôi đã đọc nhiều về cả hai mặt của cuộc tranh luận này: có tăng hiệu suất đáng kể bằng cách chỉ sử dụng các thủ tục được lưu trữ trên các truy vấn thô không? Tôi đặc biệt quan tâm đến SQL Server nhưng sẽ quan tâm đến bất kỳ và tất cả các cơ sở dữ liệu.


2
Bạn có thể gửi liên kết đến một số những gì bạn đã đọc? Tôi không nghĩ hiệu suất bị đe dọa ở đây (ít nhất là không trực tiếp)
Jack Douglas

1
@JackDoumund, hãy xem câu trả lời của mrdenny. Hiệu suất là một phần của câu hỏi / câu trả lời này.
Thomas Stringer

Câu trả lời:


31

Nó ít hơn trong SQL Server 2008 và cao hơn, nhưng nó vẫn còn đó. Vấn đề là bộ đệm của kế hoạch thực hiện và SQL Server có thể tự động truy vấn tham số được gửi đi. Khi sử dụng các thủ tục được lưu trữ (không có SQL động bên trong chúng), các truy vấn đã được tham số hóa để SQL Server không ' Không cần tạo một gói cho mỗi truy vấn khi nó chạy vì các gói đã được lưu trong bộ đệm của gói.

Và đừng quên các vấn đề bảo mật (SQL động, quyền tối thiểu, v.v.) sẽ biến mất khi sử dụng các thủ tục được lưu trữ.

Khi ứng dụng đang sử dụng SQL động dựa vào các bảng cơ sở để chọn, chèn, cập nhật và xóa dữ liệu trong các bảng, ứng dụng cần có quyền đối với tất cả các đối tượng đó trực tiếp. Vì vậy, nếu ai đó sử dụng SQL Injection để vào máy chủ, họ sẽ có quyền truy vấn, thay đổi hoặc xóa tất cả dữ liệu trong các bảng đó.

Nếu bạn đang sử dụng các thủ tục được lưu trữ, họ chỉ có quyền thực thi các thủ tục được lưu trữ để lấy lại thông tin mà thủ tục được lưu trữ sẽ trả về. Thay vì đưa ra một tuyên bố xóa nhanh và thổi bay mọi thứ, họ sẽ cần phải tìm ra các thủ tục có thể được sử dụng để xóa dữ liệu sau đó tìm ra cách sử dụng thủ tục để làm như vậy.

Cho rằng SQL Injection là cách dễ nhất để xâm nhập vào cơ sở dữ liệu, đây là loại quan trọng.


@mrdenny - bạn có thể có được hiệu ứng tương tự với "truy vấn thô" nếu chúng được tham số hóa không?
Jack Douglas

Có, nếu họ được tham số đầy đủ. Tuy nhiên, điều đó không giải quyết các vấn đề bảo mật được giải quyết bằng các thủ tục được lưu trữ.
mrdenny

10

Là một phụ lục cho câu trả lời của Denny, không có gì lạ khi tìm thấy các hệ thống mà bộ nhớ nhóm bộ đệm đáng kể bị lãng phí cho các kế hoạch thực hiện quảng cáo sử dụng đơn hoặc thấp, được tạo ra do các truy vấn được sử dụng trên các procs.

Các trường hợp xấu nhất gần đây, 8GB được phân bổ cho một phiên bản, bộ nhớ cache gói 3 GB, gói sử dụng 2,5 GB. Phần lớn trong số này là SQL2005, do đó, đây không phải là một tùy chọn để thử tối ưu hóa cho cài đặt khối lượng công việc đặc biệt.

Chắc chắn việc thực hiện các biện pháp đối với các thủ tục đối với các truy vấn thô trở nên khó khăn hơn. Một trong những lập luận mạnh mẽ nhất đối với tôi bây giờ là "Nếu bạn sử dụng các quy trình, tôi sẽ dễ dàng hơn rất nhiều khi giúp đỡ khi có vấn đề về hiệu suất". Giao diện động / linq / orm không ngăn bạn điều chỉnh, nhưng nó có thể hạn chế nghiêm trọng các tùy chọn của bạn.


Có một bài viết liên quan tuyệt vời ở đây, bao gồm các tập lệnh để xóa các kế hoạch sử dụng một lần. sqlskills.com/bloss/kimberly/ từ
Một số

7

SQL Server lưu trữ và tối ưu hóa các thủ tục được lưu trữ và SQL ad-hoc theo cùng một cách. Ví dụ: quy trình này:

create procedure dbo.TestSB(@id int) as select * from Orders where id = @id

Sẽ được tối ưu hóa và lưu vào bộ nhớ cache để:

select * from Orders where id = @id

Tuy nhiên, SQL ad-hoc sau đây không thể được lưu trữ hiệu quả do giá trị được mã hóa cứng:

select * from Orders where id = 42

Mặc dù hiệu suất là như nhau, có những lý do tốt để sử dụng các thủ tục được lưu trữ. Các thủ tục lưu trữ cung cấp một sự tách biệt rõ ràng giữa DBA và các nhà phát triển ứng dụng. Thật tốt khi có thêm một lớp bảo vệ giữa dữ liệu quý giá của bạn và các chương trình thay đổi liên tục :)


Đặc biệt là +1 nếu bạn buộc tất cả quyền truy cập phải đi qua SP của bạn và chúng được coi là API giao dịch không chỉ là lớp CRUD
Jack Douglas

Trong năm 2008+, id = 42truy vấn có thể được tối ưu hóa bằng cách sử dụng cùng một gói tùy thuộc vào cài đặt tham số hóa đơn giản / bắt buộc. Tất nhiên các truy vấn nên được tham số chính xác. :-)
Aaron Bertrand
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.