2008-10-16 38 views
7

thể trùng lặp:
Are Stored Procedures more efficient, in general, than inline statements on modern RDBMS's?đang được lưu trữ thủ tục nhanh hơn cho các truy vấn đơn giản

Nếu tôi thực hiện một thủ tục lưu trữ cho các truy vấn cơ bản, chẳng hạn như:

SELECT ColA, ColB FROM MyTable WHERE ID = 123; 
SELECT * FROM MyTable,OtherTable WHERE MyTable.ID = OtherTable.ID ORDER BY CreatedAt desc 

Có lợi ích để chuyển đổi các truy vấn đó thành một thủ tục được lưu trữ nếu chúng được chạy thường xuyên? Khi nào thì tốt hơn khi sử dụng một tập hợp được lưu trữ? Khi nào tôi nên không sử dụng quy trình được lưu trữ?

Loại tối ưu hóa nào, nếu có, xảy ra khi bạn tạo và chạy thủ tục được lưu trữ? Bạn có thể giới thiệu bất kỳ tài nguyên nào để giúp tôi hiểu khi nào và tại sao tôi nên sử dụng chúng?

Nếu có bất kỳ sự khác biệt nào, cơ sở dữ liệu của tôi là một MS SQL 2005 db.

Trả lời

12

Lý do cho việc sử dụng thủ tục lưu trữ:

  • Giảm lưu lượng mạng - bạn phải gửi các câu lệnh SQL trên mạng. Với sprocs, bạn có thể thực hiện SQL theo lô, cũng hiệu quả hơn.
  • Kế hoạch truy vấn bộ đệm - lần đầu tiên sproc được thực hiện, SQL Server tạo một kế hoạch thực hiện, được lưu trữ để sử dụng lại. Điều này đặc biệt có hiệu suất đối với các truy vấn nhỏ chạy thường xuyên.
  • Khả năng sử dụng tham số đầu ra - nếu bạn gửi SQL nội tuyến trả về một hàng, bạn chỉ có thể lấy lại bản ghi. Với sprocs, bạn có thể lấy lại chúng dưới dạng tham số đầu ra, nhanh hơn đáng kể.
  • Quyền - khi bạn gửi SQL nội tuyến, bạn phải cấp quyền truy cập vào bảng (s) cho người sử dụng, được cấp quyền truy cập nhiều hơn chỉ đơn thuần là cấp phép để thực hiện một sproc
  • Tách logic - xóa mã tạo SQL và tách riêng nó trong cơ sở dữ liệu.
  • Khả năng chỉnh sửa mà không biên dịch lại - điều này có thể gây tranh cãi. Bạn có thể chỉnh sửa SQL trong một sproc mà không cần phải biên dịch lại ứng dụng.
  • Tìm nơi bảng được sử dụng - với sprocs, nếu bạn muốn tìm tất cả các câu lệnh SQL tham chiếu đến một bảng cụ thể, bạn có thể xuất mã sproc và tìm kiếm nó. Điều này là dễ dàng hơn nhiều so với cố gắng tìm nó trong mã.
  • Tối ưu hóa - Một DBA dễ dàng tối ưu hóa SQL và điều chỉnh cơ sở dữ liệu khi sử dụng sprocs. Nó dễ dàng hơn để tìm chỉ mục bị thiếu và như vậy.
  • Tấn công SQL injection - SQL nội tuyến được viết đúng cách có thể bảo vệ chống lại các cuộc tấn công, nhưng sprocs tốt hơn cho việc bảo vệ này.
+0

Điểm tuyệt vời. Tôi đặc biệt muốn nhiều lập trình viên hơn sẽ nhận ra cách vunerable để gian lận databasea của họ là nếu họ đặt quyền ở cấp độ bảng. – HLGEM

+1

Đáng sợ phải không?Nếu tôi hiểu nó một cách chính xác, nhiều thao tác LINQ sử dụng SQL được tạo ra thay vì các thủ tục được lưu trữ chỉ làm tăng thực hành truy cập bảng trực tiếp. Tiếp tục nhận được tin nhắn của bạn! – DOK

Các vấn đề liên quan