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

SQL động so với thủ tục được lưu trữ

SQL động và các thủ tục được lưu trữ là hai trong số các thành phần quan trọng nhất của SQL Server. Trong bài viết này, chúng ta sẽ xem xét những ưu điểm và nhược điểm của từng loại và khi nào nên sử dụng chúng.

Hiệu suất

Mọi người đều biết câu trả lời cho câu hỏi này. Các thủ tục được lưu trữ đánh bại SQL động về mặt hiệu suất. Một thủ tục đã lưu trữ được lưu trong bộ nhớ máy chủ và việc thực thi nó nhanh hơn nhiều so với SQL động. Nếu tất cả các biến còn lại được giữ không đổi, thủ tục được lưu trữ sẽ hoạt động tốt hơn SQL động.

Tách các mối quan tâm

Về mặt tách biệt các mối quan tâm, các thủ tục được lưu trữ đánh bại các thủ tục SQL động.

Các thủ tục được lưu trữ cho phép bạn giữ logic cơ sở dữ liệu của mình tách biệt với logic nghiệp vụ của bạn. Do đó, nếu lỗi xảy ra trong logic nghiệp vụ của bạn, bạn chỉ phải thay đổi mã ứng dụng của mình. Ngược lại, nếu có vấn đề với logic cơ sở dữ liệu của bạn, thì chỉ cần sửa đổi thủ tục đã lưu trữ của bạn. Ngoài ra, nếu một quy trình đã lưu trữ được cập nhật, mã ứng dụng không cần phải được biên dịch lại và triển khai.

Nếu bạn sử dụng truy vấn SQL động trong mã máy khách của mình, bạn sẽ phải cập nhật mã ứng dụng nếu có lỗi xảy ra trong truy vấn SQL. Điều này có nghĩa là bạn sẽ phải biên dịch lại và triển khai mã ứng dụng.

Lưu lượng mạng

Các thủ tục được lưu trữ tạo ra ít lưu lượng mạng hơn so với SQL động vì việc thực thi một thủ tục được lưu trữ chỉ yêu cầu tên thủ tục và các tham số (nếu có) được gửi qua mạng.

Việc thực thi SQL động yêu cầu toàn bộ truy vấn phải được gửi qua mạng, làm tăng lưu lượng mạng, đặc biệt nếu truy vấn rất lớn.

Tấn công SQL Injection

Các thủ tục được lưu trữ không dễ bị tấn công SQL Injection.

Truy vấn SQL động dễ bị tấn công SQL injection nếu không sử dụng truy vấn tham số và không thể sử dụng truy vấn tham số với SQL động nếu tên bảng hoặc cột được chuyển dưới dạng tham số.

Trong trường hợp này, cách giải quyết là hàm tên mã có thể được sử dụng để ngăn chặn các cuộc tấn công đưa vào SQL.

Khả năng tái sử dụng của các kế hoạch truy vấn đã lưu trong bộ nhớ cache

Các thủ tục được lưu trữ cải thiện hiệu suất cơ sở dữ liệu vì chúng cho phép sử dụng lại các kế hoạch truy vấn đã lưu trong bộ nhớ cache. Trong trường hợp SQL động, bạn sẽ phải sử dụng các truy vấn được tham số hóa để tăng khả năng tái sử dụng kế hoạch truy vấn đã lưu trong bộ nhớ cache. Trong trường hợp không có các kế hoạch truy vấn được tham số hóa, máy chủ SQL sẽ tự động phát hiện các tham số và tạo các kế hoạch truy vấn được lưu trong bộ nhớ cache, dẫn đến cải thiện hiệu suất.

Điều cần đề cập ở đây là chỉ các hệ thống OLTP được hưởng lợi từ khả năng tái sử dụng kế hoạch truy vấn đã lưu trong bộ nhớ cache. Trong trường hợp hệ thống OLAP, việc lựa chọn thay đổi trình tối ưu hóa, hệ thống OLAP được hưởng lợi từ gói duy nhất.

Bảo trì

Các thủ tục được lưu trữ với SQL tĩnh dễ bảo trì hơn. Ví dụ, trong trường hợp SQL tĩnh trong một thủ tục được lưu trữ, các lỗi cú pháp có thể được phát hiện trước khi chạy. Trong trường hợp SQL động bên trong các thủ tục được lưu trữ, không thể mắc lỗi cú pháp trước khi thực thi truy vấn.

Hơn nữa, các thủ tục được lưu trữ giống các hàm hơn, chúng được định nghĩa một lần và sau đó có thể được gọi ở bất kỳ đâu trong tập lệnh. Do đó, nếu bạn muốn cập nhật một thủ tục đã lưu trữ, bạn chỉ phải cập nhật nó tại một nơi. Tất cả các phần ứng dụng gọi thủ tục được lưu trữ sẽ có quyền truy cập vào phiên bản cập nhật. Tuy nhiên, một nhược điểm là các phần ứng dụng đó cũng có thể bị ảnh hưởng khi bạn không muốn cập nhật quy trình được lưu trữ. Trong trường hợp SQL động, bạn có thể phải viết tập lệnh SQL ở nhiều nơi, nhưng trong những trường hợp như vậy, việc cập nhật tập lệnh ở một nơi không ảnh hưởng đến nơi khác. Quyết định giữa việc sử dụng một thủ tục được lưu trữ và SQL động phụ thuộc vào chức năng của ứng dụng.

Bảo mật

Nếu nhiều ứng dụng truy cập cơ sở dữ liệu, thì việc sử dụng các thủ tục được lưu trữ sẽ an toàn hơn so với SQL động.

Các thủ tục được lưu trữ cung cấp một lớp bảo mật bổ sung, trong khi ngữ cảnh người dùng là cách duy nhất để kiểm soát quyền trên các tập lệnh SQL động. Nói chung, việc bảo mật SQL động tốn nhiều công sức so với các thủ tục được lưu trữ.

Xác định sự phụ thuộc

Trong cơ sở dữ liệu quan hệ, các bảng có sự phụ thuộc vào các bảng khác trong cơ sở dữ liệu.

Hãy xem xét một tình huống mà bạn muốn xóa một bảng nhưng trước khi làm điều đó, bạn muốn tìm hiểu tất cả các phụ thuộc của bảng. Hay nói một cách đơn giản, bạn muốn tìm các truy vấn truy cập vào bảng mà bạn muốn xóa. Trong những trường hợp này, bạn có thể sử dụng quy trình lưu trữ sp_depends.

Tuy nhiên, sp_depends chỉ có thể phát hiện những phụ thuộc khi SQL tĩnh được sử dụng bên trong một thủ tục được lưu trữ. Trong trường hợp SQL động phụ thuộc vào một bảng, thì thủ tục lưu trữ sp_depends không thể phát hiện ra sự phụ thuộc đó. Hãy để chúng tôi thấy điều này đang hoạt động với sự trợ giúp của một ví dụ đơn giản.

Chuẩn bị dữ liệu giả

Hãy tạo một số dữ liệu giả để giúp giải thích khái niệm về sự phụ thuộc trong SQL động và tĩnh.

CREATE DATABASE deptest;

USE deptest
CREATE TABLE student
(

	Id int identity primary key,
	Name VARCHAR(50) NOT NULL,
	Gender VARCHAR(50) NOT NULL,
	Age int
)

INSERT INTO student

VALUES
('James', 'Male', 20),
('Helene', 'Female', 20),
('Sofia', 'Female', 20),
('Ed', 'Male', 20),
('Ron', 'Female', 20)

Bây giờ chúng ta có một cơ sở dữ liệu thử nghiệm chứa một bảng và một số dữ liệu thử nghiệm. Bây giờ, hãy tạo hai thủ tục được lưu trữ để truy cập vào bảng sinh viên.

Thủ tục được lưu trữ đầu tiên sử dụng SQL tĩnh để truy xuất tất cả các bản ghi từ bảng sinh viên:

USE deptest
GO
CREATE PROC spStatProc
AS
BEGIN
	SELECT * FROM student
END

Thực hiện script ở trên. Tập lệnh này tạo một thủ tục được lưu trữ “spStatProc” bên trong cơ sở dữ liệu deptest.

Hãy tạo một thủ tục được lưu trữ khác có chứa SQL động để truy xuất tất cả các bản ghi từ bảng sinh viên.

USE deptest
GO
CREATE PROC spDynProc
AS
BEGIN
	DECLARE @query NVARCHAR(100)
	SET @query = 'SELECT * FROM student'
	EXECUTE sp_execute @query
	
END

Tập lệnh này tạo ra một thủ tục được lưu trữ “spDynProc” bên trong cơ sở dữ liệu deptest. Thủ tục được lưu trữ này sử dụng một câu lệnh SQL động để truy xuất tất cả các bản ghi từ bảng sinh viên.

Bây giờ chúng ta có hai thủ tục được lưu trữ có phụ thuộc vào bảng sinh viên. Một trong số chúng chứa SQL tĩnh và cái kia chứa SQL động.

Tuy nhiên, nếu bạn thực thi thủ tục lưu trữ sp_depends và chuyển nó vào bảng sinh viên dưới dạng tham số, bạn sẽ thấy rằng nó sẽ chỉ truy xuất thủ tục được lưu trữ “spStatProc”. Điều này là do nó chứa SQL tĩnh. Thủ tục được lưu trữ “spDynProc” sẽ bị bỏ qua vì nó chứa SQL động.

Thực thi tập lệnh sau.

USE deptest
GO
EXECUTE sp_depends student

Nó sẽ nhận được kết quả sau:

[id bảng =40 /]

Bạn có thể thấy rằng sp_depends không thể báo cáo sự phụ thuộc “spDynProc” và chỉ báo cáo “spStatProc”.

Độ phức tạp

Các thủ tục đã lưu trữ có thể trở nên cực kỳ phức tạp nếu bạn đang sử dụng số lượng lớn các bộ lọc và có nhiều mệnh đề AND và OR giữa các bộ lọc. Mặt khác, sử dụng SQL động, bạn có thể tạo động các mệnh đề WHERE tùy thuộc vào loại bộ lọc. Điều này làm cho SQL động trở thành lựa chọn tốt hơn nếu bạn muốn triển khai logic cực kỳ phức tạp.

Kết luận

Nhìn chung, thủ tục được lưu trữ vượt trội hơn SQL động ở hầu hết các khía cạnh. Chúng nhanh hơn, an toàn và dễ bảo trì và yêu cầu ít lưu lượng mạng hơn. Theo nguyên tắc chung, các thủ tục được lưu trữ nên được sử dụng trong các tình huống mà bạn không phải sửa đổi các truy vấn của mình và các truy vấn của bạn không quá phức tạp. Tuy nhiên, nếu bạn thường xuyên thay đổi tên bảng, tên cột hoặc số lượng tham số trong truy vấn của mình, thì Dynamic SQL là lựa chọn tốt hơn do chiến lược triển khai đơn giản hơn.

Các liên kết hữu ích

  • SQL động so với các thủ tục được lưu trữ
  • Đừng sợ SQL động
  • Xây dựng các thủ tục được lưu trữ hiệu suất cao
  • Các lớp học về các thủ tục được lưu trữ

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách tạo bảng với ràng buộc khóa ngoại trong SQL Server - Hướng dẫn SQL Server / TSQL Phần 66

  2. Tại sao tôi không thể sử dụng bí danh trong câu lệnh DELETE?

  3. Công cụ cho dữ liệu bảng kịch bản

  4. Cách thay đổi mức độ tương thích của cơ sở dữ liệu với T-SQL

  5. SQL Server chuyển đổi chuỗi thành datetime