Ta có thể xóa các Execution Plan được lưu trong bộ nhớ hay không?
Câu trả lời là có, dùng câu lệnh DBCC FREEPROCCACHE. Nhưng lưu ý là không nên dùng câu lệnh này ở máy chủ SQL Server đang làm việc thực sự (Production Server), chỉ nên dùng ở máy chủ SQL Server mà bạn dùng để thử nghiệm, vì nó sẽ bắt máy chủ làm việc nhiều hơn để các Execution Plan được tạo lại từ đầu.
Execution Plan được tái sử dụng như thế nào?
Ta xem xét câu truy vấn sau:
Select * from TenBang where ID=1
Khi câu truy vấn này được submit, Optimizer tạo ra một Execution Plan và lưu nó vào Procedure Cache để dùng lại lần sau. Nếu câu truy vấn này được submit với một giá trị khác, ví dụ như ID=2, nó có thể dùng lại Execution Plan được tạo ra trước đó. Nhưng Execution Plan có được dùng lại hay không phụ thuộc vào cách câu truy vấn được gửi đến SQL Server.
Khi một câu truy vấn được gửi đến SQL Server, nó được phân loại ra làm 2 kiểu sau:
Ta sẽ tìm hiểu 2 kiểu này để xem Execution Plan ở mỗi kiểu được SQL Server xử lý như thế nào.
Ad Hoc Workload
- Những câu truy vấn được gửi đến SQL Server mà không tách biệt rõ ràng các biến thành những tham số gọi là Ad Hoc workloads, hay Ad Hoc Queries. Ví dụ:
- Select * from tblProduct where ProductID=1
- Trong câu truy vấn trên, điều kiện là ProductID=1 được nhúng trực tiếp vào câu truy vấn mà không tách biệt ra thành tham số, điều này làm cho Execution Plan tạo ra bởi câu truy vấn này không thể tái sử dụng, trừ khi bạn sử dụng lại cùng giá trị, ở đây là ProductID=1.
Prepared Workload:
Những câu truy vấn được gửi đến SQL Server mà tách biệt rõ ràng các biến thành những tham số, không nhúng giá trị biến trực tiếp vào câu truy vấn, gọi là Prepared Workload. Có 3 kiểu viết để câu truy vấn được phân loại là Prepared Workload:
- Stored Procedures: Kiểu này đã quen thuộc với người dùng SQL Server từ cơ bản đến nâng cao.
- Sp_executesql: cho phép thực thi câu lệnh SQL hay một chuỗi các câu lệnh SQL (gọi là SQL Batch) có chứa những tham số do người dùng định nghĩa.
- Prepare/execute model: cho phép một SQL client yêu cầu một Execution Plan cho những lần thực thi sau này của một câu lệnh SQL giống nhau, khác tham số.
Ví dụ về Prepared Workload, kiểu viết Store Procedure sau đây tách biệt rõ ràng tham số
1
2
3
4
5
6
7
8
9
|
IF ( SELECT OBJECT_ID(‘spTest’)) IS NOT NULL
DROP PROC dbo.spTest
GO
CREATE PROC dbo.spTest
@ID int
AS
SELECT ProductName, Price
FROM dbo.tblProduct
WHERE ProductID=@ID
|