
Những thói quen tốt khi viết câu lệnh T-SQL (Phần 3)
Quản Trị Mạng - Trong phần ba này, bài viết sẽ giới thiệu cho bạn cách viết
câu lệnh T-SQL để đẩy mạnh việc tái sử dụng sơ đồ lưu cache (bộ nhớ đệm).
Hiểu rõ vấn đề các khoảng trắng và ghi chú tác động thế nào tới việc tạo sơ đồ
mới lưu cache hay tái sử dụng sơ đồ sẵn có sẽ giúp bạn giảm thiểu số lượng sơ
đồ mà ứng dụng của bạn phải lưu cache.
Phần 1
Phần 2
Khám phá sơ đồ lưu bộ nhớ đệm
Bạn đã tận dụng được lợi thế từ việc lưu sơ đồ trên bộ nhớ đệm chưa? Bạn đã
khai thác các sơ đồ lưu cache đến mức nào? Ứng dụng của bạn chỉ sử dụng
chúng một lần hay tận dụng nhiều lần? Bạn có nhiều sơ đồ lưu cache cho cùng
một truy vấn trong cache thủ tục cùng lúc không? Khoảng trống các sơ đồ lưu
cache sử dụng là bao nhiêu? Trên đây là một số câu hỏi bạn cần trả lời để chắc
rằng bạn đã tối ưu hóa cache thủ tục và giảm thiểu số lượng sơ đồ lưu cache
mà ứng dụng tạo ra. Có một vài vấn đề nhỏ trong cách viết câu lệnh T-SQL
của bạn là nguyên nhân khiến máy chủ SQL phải thực hiện thêm nhiều việc để

biên dịch và lưu cache các sơ đồ thực thi cho cùng một đoạn code.
Trước khi máy chủ SQL có thể tiến hành xử lý đoạn code T-SQL, nó cần tạo
một bản sơ đồ thực thi. Để tạo bản sơ đồ thực thi, trước tiên máy chủ SQL ph
ải
tiêu tốn những nguồn tài nguyên giá trị như CPU nhằm biên dịch code T-SQL.
Khi sơ đồ được tạo xong, nó sẽ được lưu cache để có thể tái sử dụng khi ứng
dụng gọi cùng một câu lệnh T-SQL nhiều hơn một lần. Bạn có thể cải thiện
hiệu suất máy chủ SQL nếu bạn viết câu lệnh T-SQL để tăng cư
ờng tái sử dụng
sơ đồ lưu cache với những đoạn T-SQL thường xuyên được thực thi.
Với sự xuất hiện của SQL Server 2005, Microsoft cung cấp các DMV
(Dynamic Management Views - Cửa sổ quản lý động) cho phép bạn khám phá
các sơ đồ lưu. Bằng cách sử dụng các DMV, bạn có thể tìm hiểu được nhiều
điều về các sơ đồ lưu cache. Sau đây là danh sách tóm t
ắt những thứ bạn có thể
nhận biết:
Các đoạn text liên quan tới sơ đồ lưu cache
Số lần sơ đồ lưu cache được thực thi
Kích cỡ sơ đồ lưu cache
Ở đoạn sau của bài viết, tôi sẽ hướng dẫn các bạn cách sử dụng DMV để tìm

hiểu thông tin sơ đồ lưu cache.
Tạo nhiều sơ đồ vì các ghi chú hoặc khoảng trắng thừa
Tôi chắc rằng các bạn đều ủng hộ ý tưởng đặt code vào các thủ tục lưu trữ
(Stored Procedure - SP). Chúng ta thực hiện việc này nhằm tăng khả năng tái
sử dụng code trong khuôn khổ một ứng dụng đơn lẻ hoặc trên nhiều ứng dụng.
Tuy nhiên, không phải tất cả các đoạn code được thực thi bởi máy chủ SQL
đều nằm trong các SP. Vài ứng dụng có thể được viết bằng các lệnh T-SQL
dạng in-line (lệnh thô). Nếu bạn đang viết các đoạn mã T-SQL dạng thô, bạn
cần phải cẩn thận khi ghi chú hoặc đặt khoảng trắng bởi nó có thể là nguyên
nhân khiến máy chủ SQL tạo nhiều sơ đồ lưu cache cho cùng một đoạn code
T-SQL.
Sau đây là một ví dụ gồm hai câu lệnh T-SQL khác nhau:
SELECT * FROM AdventureWorks.Production.Product
GO
SELECT * FROM AdventureWorks.Production.Product -- return records
GO
Như b
ạn thấy, tôi có hai câu lệnh T-SQL giống nhau. Cả hai đều trả về tất cả

bản ghi từ bảng AdventureWorks.Production.Product. Vậy bạn nghĩ máy chủ
SQL sẽ tạo ra bao nhiêu sơ đồ lưu cache khi chạy đoạn mã trên? Để trả lời câu
hỏi này, tôi sẽ tìm hiểu thông tin sơ đồ lưu cache bằng cách sử dụng các DMV
trong SQL Server 2005 và SQL Server 2008. Để xem các sơ đồ tạo bởi hai câu
lệnh T-SQL trên, tôi sẽ chạy đoạn code sau:
DBCC FREEPROCCACHE
GO
SELECT * FROM AdventureWorks.Production.Product
GO
SELECT * FROM AdventureWorks.Production.Product -- return records
GO
SELECT stats.execution_count AS exec_count,
p.size_in_bytes as [size],
[sql].[text] as [plan_text]
FROM sys.dm_exec_cached_plans p
outer apply sys.dm_exec_sql_text (p.plan_handle) sql
join sys.dm_exec_query_stats stats ON stats.plan_handle = p.plan_
handle
GO
Trong đoạn code trên, trước tiên tôi giải phóng cache thủ tục bằng cách chạy

lệnh DBCC FREEPROCCACHE. Lệnh này xóa bỏ toàn bộ sơ đồ thực thi
trong bộ nhớ. Tuy nhiên tôi cũng xin có lời lưu ý rằng bạn không nên sử dụng
lệnh này khi làm việc trong doanh nghiệp bởi nó sẽ xóa bỏ toàn bộ sơ đồ lưu
cache. Điều này có thể gây ra những tác động to lớn tới công việc của bạn do
những sơ đồ thường dùng đều bị biên dịch lại. Sau khi giải phóng cache thủ
tục, tôi chạy tiếp hai câu lệnh SELECT khác nhau. Cuối cùng, tôi liên kết
thông tin từ các DMV lại để trả về thông tin sơ đồ lưu cache của hai câu lệnh
SELECT. Sau đây là kết quả nhận được khi chạy đoạn code trên:
exec_count size plan_text
---------- ----- ---------
1 40960 SELECT * FROM AdventureWorks.Production.Product --
return records
1 40960 SELECT * FROM AdventureWorks.Production.Product
Như b
ạn thấy, hai câu lệnh SELECT trên tạo ra hai sơ đồ lưu cache khác nhau
và mỗi sơ đồ được thực thi 1 lần (exec_count number). Sở dĩ chuyện này xảy
ra là vì hai câu lệnh SELECT không hoàn toàn giống nhau. Câu lệnh SELECT
thứ hai hơi khác một chút vì có thêm ghi chú. Ngoài ra, các bạn hãy để ý kích
cỡ sơ đồ: 40960 byte - kích cỡ bộ nhớ quá lớn dành cho một câu lệnh T-SQL
rất đơn giản. Vì thế, bạn nên cẩn thận khi thêm ghi chú vào code, tránh để máy

