1. Trang chủ
  2. » Công Nghệ Thông Tin

Tài liệu Những thói quen tốt khi viết câu lệnh T-SQL doc

12 326 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 12
Dung lượng 260,57 KB

Nội dung

Những thói quen tốt viết câu lệnh T-SQL Hiệu ứng dụng phụ thuộc vào nhiều yếu tố, có yếu tố quan trọng thời gian để máy chủ SQL xử lý câu lệnh T-SQL Đôi thiết kế sở liệu yêu cầu truy vấn phức tạp làm cản trở tốc độ thực thi câu lệnh T-SQL Cách viết code câu lệnh T-SQL khiến máy chủ SQL phải làm việc nhiều để xử lý truy vấn Bài viết sau giới thiệu cho bạn thói quen tốt nên tập luyện viết code T-SQL Qua bạn hiểu làm để viết câu truy vấn tối ưu, tận dụng tốt tài nguyên máy chủ SQL cải thiện hiệu suất Ghi rõ tên cột câu lệnh SELECT SELECT * FROM MyTable; Bạn viết câu lệnh lần? Việc sử dụng dấu (*) cho sở liệu biết bạn muốn trả tất cột từ bảng (hoặc bảng) khai báo mệnh đề FROM Đây khơng phải thói quen tốt bạn muốn tất cột trả ứng dụng Tốt bạn nên ghi rõ tên cột bảng sau: SELECT ID, Description, DateModified FROM MyTable; Việc khai báo rõ ràng tên cột câu lệnh SELECT mang lại nhiều lợi ích Thứ nhất, máy chủ SQL trả liệu cần thiết cho ứng dụng đống liệu mà có nhiều thứ ứng dụng bạn không cần đến Bằng cách yêu cầu trả liệu cần thiết, bạn góp phần tối ưu hóa khối lượng cơng việc máy chủ SQL cần thực để thu thập tất cột thơng tin bạn u cầu Ngồi ra, nhờ không sử dụng dấu (*) nên bạn giảm thiểu lưu lượng truyền tải qua mạng (số byte) cần thiết để gửi liệu liên quan đến câu lệnh SELECT tới ứng dụng Trong trường hợp bạn dùng dấu (*) có thêm cột vào bảng, ứng dụng bạn bắt đầu tiếp nhận liệu cho cột mà không thay đổi mã nguồn ứng dụng Nếu ứng dụng bạn chờ đợi số lượng cột định trả về, bị lỗi có người bổ sung cột vào bảng tham chiếu Bằng việc khai báo rõ ràng tên cột câu lệnh SELECT, ứng dụng nhận số lượng cố định cột trả về, có người thêm cột vào bảng tham chiếu câu lệnh SELECT Nhờ vậy, bạn giúp ứng dụng tránh khỏi nguy tiềm tàng liên quan đến thay đổi sở liệu xảy đến với bảng bạn tham chiếu tới câu lệnh SELECT Ghi rõ tên cột câu lệnh INSERT Cũng giống trên, bạn nên rõ tên cột bạn muốn chèn liệu vào câu lệnh INSERT Đừng viết câu lệnh INSERT sau: INSERT INTO MyTable VALUES ('A','B','C'); Khi bạn viết kiểu này, máy chủ SQL đòi hỏi ba cột định nghĩa bảng MyTable, giá trị “A” chèn vào cột đầu tiên, “B” vào cột thứ hai, “C” vào cột cuối Nếu thêm cột vào bảng MyTable, ứng dụng bạn bị lỗi: Msg 213, Level 16, State 1, Line Column name or number of supplied values does not match table definition (Tên cột số lượng giá trị khơng khớp với bảng) Vì thế, thay viết câu lệnh INSERT trên, bạn nên viết sau: INSERT INTO MyTable(So1, So2, So3) VALUES ('A','B','C'); Bằng cách viết trên, thêm cột tên “So4” vào bảng MyTable, câu lệnh INSERT tiếp tục làm việc với điều kiện cột “So4” tạo với giá trị mặc định DEFAULT cho phép NULL Thêm tiền tố cho wildcard để tăng tốc tìm kiếm Sử dụng ký tự thay (wildcard) thích hợp cải thiện hiệu suất câu truy vấn Chẳng hạn bạn muốn tìm kiếm bảng AdventureWorks.Person.Contact tất LastNames kết thúc “sen” Giả dụ bạn xây dựng mục cột LastName Nếu bạn viết câu lệnh tìm kiếm sau: SELECT Distinct LastName FROM Person.Contact WHERE LastName LIKE '%sen' Câu lệnh sử dụng ký tự phần trăm (%) để thay cho không nhiều ký tự theo sau chuỗi “sen” trường LastName Điều khiến máy chủ SQL thực thao tác quét mục nhằm tìm kiếm tất tên kết thúc “sen” để giải câu truy vấn Việc có ý nghĩa toàn bảng quét, máy chủ SQL khơng thể đảm bảo tìm tồn ghi có LastName kết thúc “sen” Ngồi ra, bạn tìm kiếm ghi có LastName dài sáu ký tự kết thúc “sen”, bạn viết câu lệnh tìm kiếm sau: SELECT Distinct LastName FROM Person.Contact WHERE LastName LIKE ' _sen’ Ở đây, câu lệnh sử dụng ký tự gạch (_) để thay cho ký tự đơn Ví dụ tương tự với ví dụ phần sử dụng thao tác quét mục để giải Một lần nữa, máy chủ SQL biết cần phải quét toàn mục trước đảm bảo tìm thấy tất tên dài sáu ký tự kết thúc “sen” bảng Person.Contact Máy chủ SQL trả kết nhanh khơng phải đọc tồn mục cách sử dụng chế quét Máy chủ SQL đủ thông minh để nhận biết bạn đặt thêm tiền tố trước ký tự thay (%, _, v.v ), dùng thao tác tìm kiếm mục để tiến hành giải tiêu chí tìm kiếm Sau ví dụ câu lệnh tìm kiếm yêu cầu trả tất ghi có LastName bắt đầu ký tự “A” kết thúc “sen”: SELECT Distinct LastName FROM Person.Contact WHERE LastName LIKE 'A%sen' Bằng cách đặt ký tự “A” phía trước dấu phần trăm (%) câu lệnh tìm kiếm, bạn cho máy chủ SQL biết sử dụng thao tác tìm kiếm mục để giải câu truy vấn Một máy chủ SQL đọc tới ghi cuối có LastName bắt đầu ký tự “A”, biết khơng cịn ghi có LastName bắt đầu ký tự “A” dừng lại Không phải tất ký tự thay cần thêm tiền tố để máy chủ SQL dùng thao tác tìm kiếm mục nhằm giải truy vấn Sau ví dụ câu lệnh sử dụng biểu thức thể tập hợp ký tự thay cho phép máy chủ SQL giải câu truy vấn cách dùng thao tác tìm kiếm mục: SELECT Distinct LastName FROM Person.Contact WHERE LastName LIKE '[A-M]%sen' Câu lệnh T-SQL tìm kiếm tồn LastName bắt đầu ký tự khoảng từ “A” đến “M” kết thúc “sen” Các cú pháp sử dụng ký tự thay khác rõ tập hợp ký tự gọi thao tác quét mục để giải tiêu chí tìm kiếm Chỉ dùng DISTINCT cần Đặt từ khóa DISTINCT câu lệnh SELECT loại bỏ kết trùng lặp số kết trả câu truy vấn Nó khiến máy chủ SQL phải thực thêm thao tác SORT để xếp liệu nhằm nhận biết loại bỏ trùng lặp Vì thế, bạn biết trước kết trả khơng trùng lặp khơng nên dùng từ khóa DISTINCT câu lệnh T-SQL Với việc sử dụng từ khóa DISTINCT câu truy vấn, bạn yêu cầu máy chủ SQL thực thao tác xếp vào loại bỏ kết trùng lặp Đây phần công việc phụ thêm máy chủ SQL khơng có ý nghĩa tập hợp kết bạn bao gồm ghi độc Chỉ dùng UNION cần Cũng giống trường hợp từ khóa DISTINCT, tốn tử UNION địi hỏi thêm thao tác SORT để máy chủ SQL loại bỏ kết trùng lặp Nếu bạn biết trước danh sách kết trả khơng có kết giống thao tác xếp mà máy chủ SQL phải thực trở nên không cần thiết Bởi bạn cần dùng toán tử UNION để nối hai tập hợp ghi với nhau, ghi độc không trùng lặp, tốt bạn nên dùng toán tử UNION ALL Toán tử UNION ALL không loại bỏ ghi trùng lặp giảm nhẹ phần công việc cho máy chủ SQL q trình xử lý khơng phải thực thao tác xếp Giảm bớt công việc cho máy chủ SQL đồng nghĩa với việc thao tác xử lý thực nhanh Áp dụng thói quen tốt để code nhanh Có nhiều lý để tập luyện cho quen với lối viết code tối ưu Khi bạn áp dụng thành thạo thủ thuật nhỏ nêu biến thành thói quen viết câu lệnh T-SQL, bạn tránh rủi ro xảy sở liệu thay đổi, đồng thời cải thiện hiệu suất làm việc máy chủ nhờ giảm thiểu lưu lượng truyền tải qua mạng Những thủ thuật đơn giản giúp bạn tận dụng tốt tài nguyên máy chủ trình xử lý câu lệnh Để nâng cao hiệu suất máy chủ SQL giảm thiểu lỗi tiềm tàng cho ứng dụng, cần phải tập viết code câu lệnh TSQL cách tối ưu Trong phần đầu viết, bạn giới thiệu số thủ thuật hữu ích giúp máy chủ giảm bớt thao tác thừa Phần hai tập trung vào việc làm để tối ưu hóa thủ tục lưu trữ đa Những thói quen tốt viết câu lệnh T-SQL (Phần 1) Thủ tục lưu trữ đa Trước bước vào vấn đề làm để tối ưu hóa thủ tục lưu trữ đa (Jack Of All Trades Stored Procedure - SP), cần có chút khái niệm loại thủ tục Thủ tục lưu trữ đa thủ tục chấp nhận nhiều tham số khác có liên quan đến thủ tục Dựa tham số truyền vào, thủ tục lưu trữ đa xác định ghi trả Sau ví dụ thủ tục lưu trữ đa năng: CREATE PROCEDURE JackOfAllTrades (@SalesOrderID int = NULL ,@SalesOrderDetailID int = NULL ,@CarrierTrackingNumber nvarchar(25) = NULL) AS SELECT * FROM AdventureWorks.Sales.SalesOrderDetail WHERE (SalesOrderID = @SalesOrderID or @SalesOrderID IS NULL) AND (SalesOrderDetailID = @SalesOrderDetailID or @SalesOrderDetailID IS NULL) AND (CarrierTrackingNumber = @CarrierTrackingNumber or @CarrierTrackingNumber IS NULL) GO Ở SP JackOfAllTrades chấp nhận ba tham số khác Tất tham số có giá trị mặc định NULL Khi giá trị truyền vào, sử dụng tham số mệnh đề WHERE để ràng buộc ghi trả Mỗi tham số SP dùng để xây dựng mệnh đề WHERE phức tạp chứa logic sau mệnh đề WHERE tham số truyền vào: ( = @PARM or @PARM IS NULL) Logic cho biết @PARM truyền giá trị non-null ràng buộc ghi trả để chắn giá trị @PARM Phần thứ hai điều kiện “@PARM IS NULL” Phần có nghĩa @PARM khơng có giá trị truyền vào (bằng NULL) khơng ràng buộc liệu dựa tham số Cùng xem trình thực thi điển hình JackOfAllTrades SP Giả sử ta thực thi SP với lệnh sau: EXEC JackOfAllTrades @SalesOrderID = 43659 Khi chạy câu lệnh, sơ đồ thực thi trơng sau: Ở bạn thấy tham số đơn truyền vào, máy chủ định sử dụng thao tác “quét mục” Câu lệnh SELECT SP ràng buộc cột @SalesOrderID - phần khóa mục cụm Bạn nghĩ máy chủ SQL đủ thông minh để nhận xử lý thủ tục lưu trữ đa thao tác “tìm kiếm mục” nhanh lao vào mục cụm Thế ta thấy sơ đồ thực thi, máy chủ SQL không thông minh đến Tại thế? Khi máy chủ nhìn thấy điều kiện “@PARM IS NULL”, số máy chủ SQL Vì máy chủ coi khơng có mục hữu ích giúp xử lý điều kiện “( = @PARM1 or @PARM1 IS NULL)” lẽ số mệnh đề WHERE Chính mà máy chủ SQL định sử dụng thao tác “quét mục” để giải vấn đề Thủ tục lưu trữ đa có nhiều tham số, hiệu suất giảm tác động số lượng thao tác quét cần thiết cho tham số truyền vào Tối ưu hóa thủ tục lưu trữ đa Bạn không cần phải chấp nhận sử dụng thủ tục lưu trữ đa hiệu SP viết ví dụ Hãy khám phá xem SP sau làm viết lại để cơng cụ tối ưu truy vấn máy chủ SQL tạo kế hoạch thực thi tối ưu Như nói trên, vấn đề thực với thủ tục lưu trữ đa tham số bạn cần có điều kiện “OR” để kiểm tra xem tham số truyền vào có phải NULL khơng Nếu ta loại bỏ yêu cầu này, máy chủ SQL có khả lên kế hoạch sử dụng thao tác “tìm kiếm mục” Vậy làm để loại bỏ điều kiện “@PARM IS NULL”? Câu trả lời sử dụng SQL động thơng số hóa (parameterized dynamic SQL) Đến bạn nghĩ chuẩn bị mở đường cho SQL injection vào giải pháp Tuy nhiên, xây dựng mã SQL động cho phép truyền tham số SP tới SP hệ thống khác “sp_executesql” SP sử dụng tham số đoạn mã SQL động ta xây dựng SP hệ thống “sp_executesql” cho phép bạn phát triển câu lệnh T-SQL có chứa tham số, đồng thời cho phép bạn định nghĩa truyền giá trị cho tham số tới SQL động cách truyền tham số tới SP “sp_executesql” chạy SP Câu lệnh T-SQL thực thi theo cách thường gọi SQL thơng số hóa Có nhiều lý để sử dụng SQL thông số hóa, khn khổ viết tập trung vào việc làm để sử dụng SQL thơng số hóa nhằm cải thiện hiệu suất thủ tục lưu trữ đa Sau đoạn code tạo thủ tục lưu trữ đa viết lại sử dụng SQL động thông số hóa: CREATE PROCEDURE JackOfAllTrades_V2 (@SalesOrderID int = NULL ,@SalesOrderDetailID int = NULL ,@CarrierTrackingNumber nvarchar(25) = NULL) AS DECLARE @CMD NVARCHAR(max) DECLARE @WHERE NVARCHAR(max) SET @CMD = 'SELECT * FROM AdventureWorks.Sales.SalesOrderDetail ' SET @WHERE = '' IF @SalesOrderID IS NOT NULL SET @WHERE = @WHERE + 'AND SalesOrderID = @SalesOrderID ' IF @SalesOrderDetailID IS NOT NULL SET @WHERE = @WHERE + 'AND SalesOrderDetailID = @SalesOrderDetailID ' IF @CarrierTrackingNumber IS NOT NULL SET @WHERE = @WHERE + 'AND CarrierTrackingNumber = @CarrierTrackingNumber ' IF LEN(@WHERE) > SET @CMD = @CMD + ' WHERE ' + RIGHT(@WHERE,LEN(@WHERE) - 3) EXEC sp_executesql @CMD , N'@SalesOrderID int ,@SalesOrderDetailID int ,@CarrierTrackingNumber nvarchar(25)' ,@SalesOrderID = @SalesOrderID ,@SalesOrderDetailID = @SalesOrderDetailID ,@CarrierTrackingNumber = @CarrierTrackingNumber Tiếp theo sâu vào chi tiết nhằm giúp bạn hiểu rõ phần động phần thơng số hóa đoạn mã SP bắt đầu việc gán biến @CMD vào câu lệnh SELECT khơng có mệnh đề WHERE Tiếp theo ta gán biến @WHERE cho chuỗi rỗng Tiếp bốn câu IF khác Ba câu IF kiểm tra xem tham số truyền vào có thỏa mãn điều kiện NOT NULL hay khơng Nếu tham số NOT NULL, ta gắn điều kiện vào biến @WHERE tham số Do ta kiểm tra xác định tham số NOT NULL, ta không cần thêm điều kiện IS NULL vào mệnh đề WHERE đoạn code SP ban đầu phần Thay vào đó, tất ta cần thêm điều kiện = @PARM vào biến @WHERE Câu If cuối xác định xem biến @WHERE có thỏa mãn điều kiện hay khơng, có nối biến @WHERE với biến @CMD Lưu ý biến @WHERE phần động đoạn code Nhưng không đặt phần text thực tham số vào biến @WHERE, thay vào đặt tham chiếu tới tham số điều kiện WHERE Vì câu lệnh T-SQL động bao gồm câu lệnh SELECT ban đầu mệnh đề WHERE khơng cịn cần điều kiện IS NULL để ràng buộc liệu Cuối sử dụng SP “sp_executesql” để thực thi câu lệnh T-SQL động thông số hóa Để thực điều này, tơi truyền năm tham số vào SP hệ thống Tham số biến T-SQL động @CMD Tham số thứ hai khai báo tất biến có đoạn truy vấn thơng số hóa, với loại liệu chúng Với ba tham số cuối cùng, chúng truyền vào SP hệ thống giống chúng truyền vào SP lưu trữ đa phần đầu Như bạn thấy, tơi hồn tồn khơng làm đoạn mã SQL động trở nên dễ bị công SQL injection SP ban đầu Lý tơi khơng sử dụng giá trị thực tham số để chuyển tới biến @WHERE Tôi truyền tham số biến vào SQL động qua SP hệ thống “sp_executesql” Bây chạy đoạn code tạo thủ tục lưu trữ đa viết lại cách chạy câu lệnh sau: EXEC JackOfAllTrades_V2 @SalesOrderID = 43659 Khi chạy thử nghiệm với sở liệu AdventureWorks server, nhận sơ đồ thực thi sau: Khi so sánh sơ đồ với sơ đồ phần đầu, bạn thấy đơn giản sử dụng thao tác “tìm kiếm mục cụm” để xử lý SP Sở dĩ máy chủ SQL sử dụng thao tác đoạn code SQL động khơng cịn điều kiện “@PARM IS NULL” Do câu lệnh T-SQL đơn giản hóa nhờ sử dụng SQL động loại bỏ ràng buộc IS NULL, máy chủ SQL đưa kế hoạch thực thi tối ưu cho thủ tục lưu trữ đa phiên V2 Kết lại, thực tế hiệu thu mức nào? Nên nhớ ta xét ghi từ bảng SalesOrderDetail có SalesOrderID 43659 SP lưu trữ đa ban đầu sử dụng thao tác “quét mục” để xử lý truy vấn Điều có nghĩa phải đọc tồn mục trước hồn thành yêu cầu truy vấn trả ghi chứa giá trị SalesOrderID Ngược lại, phiên V2 SP lưu trữ đa sử dụng thao tác “tìm kiếm mục” với khóa mục cụm bảng SalesOrderDetail để lấy trực tiếp ghi định có chứa SalesOrderID 43659 cách nhanh chóng Thao tác “tìm kiếm mục” tối ưu thao tác “quét mục” nhiều, cụ thể nhiều nào? Việc đánh giá khoản I/O tiết kiệm nhờ dùng phiên SP lưu trữ đa V2 thực nhiều cách Ta chạy đoạn T-SQL sau đây: SET STATISTICS IO ON GO EXEC JackOfAllTrades @SalesOrderID = 43659 GO EXEC JackOfAllTrades_V2 @SalesOrderID = 43659 GO Ở sử dụng lệnh “SET STATISTICS IO ON” nên kết SP thực thi hiển thị số lượng I/O lệnh đòi hỏi để xử lý truy vấn Dưới kết nhận được: (12 row(s) affected) Table 'SalesOrderDetail' Scan count 1, logical reads 264, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads (1 row(s) affected) (12 row(s) affected) Table 'SalesOrderDetail' Scan count 1, logical reads 3, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads (1 row(s) affected) Khi nhìn kết trên, ta thấy hiệu suất SP lưu trữ đa lần quét 264 lần đọc logic Ngược lại phiên V2 có số lần quét mục cần thực lần đọc logic để xử lý truy vấn Khoản I/O tiết kiệm đc 261 Con số khơng thấm tháp gì, nhiên với trường hợp bạn phải gọi gọi lại SP vịng lặp chẳng hạn, hiệu suất cải thiện cách rõ rệt hai phiên SP Cải thiện lượng I/O nhờ sử dụng SQL động thơng số hóa Sau đọc hết phần này, bạn cần hiểu lý máy chủ SQL lại đưa sơ đồ thực thi hiệu Trên máy chủ SQL coi logic “@PARM IS NULL” số Bởi định cần phải thực thao tác “quét mục” để xử lý phiên thủ tục lưu trữ đa Như biết, thao tác quét (SCAN) chậm thao tác tìm kiếm (SEEK) Bằng cách viết lại phiên SP lưu trữ đa V2 có sử dụng T-SQL động, loại bỏ biểu thức số mệnh đề WHERE câu lệnh T-SQL Nhờ máy chủ SQL tìm phương pháp đắn sử dụng thao tác “tìm kiếm mục cụm” Nếu trang web bạn có sử dụng thủ tục lưu trữ đa năng, thử viết lại SQL động thơng số hóa chờ xem hiệu suất cải thiện Trong phần ba này, viết 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 đề khoảng trắng ghi tác động tới việc tạo sơ đồ lưu cache hay tái sử dụng sơ đồ sẵn có giúp bạn giảm thiểu số lượng sơ đồ mà ứng dụng bạn phải lưu cache Khám phá sơ đồ lưu nhớ đệm Bạn tận dụng lợi từ việc lưu sơ đồ nhớ đệm chưa? Bạn khai thác sơ đồ lưu cache đến mức nào? Ứng dụng bạn sử dụng chúng lần hay tận dụng nhiều lần? Bạn có nhiều sơ đồ lưu cache cho truy vấn cache thủ tục lúc không? Khoảng trống sơ đồ lưu cache sử dụng bao nhiêu? Trên số câu hỏi bạn cần trả lời để bạn tối ưu hóa cache thủ tục giảm thiểu số lượng sơ đồ lưu cache mà ứng dụng tạo Có vài vấn đề nhỏ cách viết câu lệnh T-SQL bạn nguyên nhân khiến máy chủ SQL phải thực thêm nhiều việc để biên dịch lưu cache sơ đồ thực thi cho đoạn code Trước máy chủ SQL tiến hành xử lý đoạn code T-SQL, cần tạo sơ đồ thực thi Để tạo sơ đồ thực thi, trước tiên máy chủ SQL phải tiêu tốn nguồn tài nguyên giá trị CPU nhằm biên dịch code T-SQL Khi sơ đồ tạo xong, lưu cache để tái sử dụng ứng dụng gọi câu lệnh T-SQL nhiều lần Bạn cải thiện hiệu suất máy chủ SQL 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 đoạn T-SQL thường xuyên thực thi Với xuất SQL Server 2005, Microsoft cung cấp DMV (Dynamic Management Views - Cửa sổ quản lý động) cho phép bạn khám phá sơ đồ lưu Bằng cách sử dụng DMV, bạn tìm hiểu nhiều điều sơ đồ lưu cache Sau danh sách tóm tắt thứ bạn 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 thực thi Kích cỡ sơ đồ lưu cache Ở đoạn sau viết, hướng dẫn bạn cách sử dụng DMV để tìm hiểu thơng tin sơ đồ lưu cache Tạo nhiều sơ đồ ghi khoảng trắng thừa Tôi bạn ủng hộ ý tưởng đặt code vào thủ tục lưu trữ (Stored Procedure SP) Chúng ta thực việc nhằm tăng khả tái sử dụng code khuôn khổ ứng dụng đơn lẻ nhiều ứng dụng Tuy nhiên, tất đoạn code thực thi máy chủ SQL nằm SP Vài ứng dụng viết lệnh T-SQL dạng in-line (lệnh thô) Nếu bạn viết đoạn mã T-SQL dạng thô, bạn cần phải cẩn thận ghi đặt khoảng trắng nguyên nhân khiến máy chủ SQL tạo nhiều sơ đồ lưu cache cho đoạn code T-SQL Sau 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 Cả hai trả tất ghi từ bảng AdventureWorks.Production.Product Vậy bạn nghĩ máy chủ SQL tạo sơ đồ lưu cache chạy đoạn mã trên? Để trả lời câu hỏi này, tìm hiểu thơng tin sơ đồ lưu cache cách sử dụng DMV SQL Server 2005 SQL Server 2008 Để xem sơ đồ tạo hai câu lệnh T-SQL trên, 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 giải phóng cache thủ tục cách chạy lệnh DBCC FREEPROCCACHE Lệnh xóa bỏ tồn sơ đồ thực thi nhớ Tuy nhiên tơi xin có lời lưu ý bạn không nên sử dụng lệnh làm việc doanh nghiệp xóa bỏ tồn sơ đồ lưu cache Điều gây tác động to lớn tới công việc bạn sơ đồ thường dùng bị biên dịch lại Sau giải phóng cache thủ tục, chạy tiếp hai câu lệnh SELECT khác Cuối cùng, liên kết thông tin từ DMV lại để trả thông tin sơ đồ lưu cache hai câu lệnh SELECT Sau kết nhận chạy đoạn code trên: exec_count size plan_text - 40960 SELECT * FROM AdventureWorks.Production.Product return records 40960 SELECT * FROM AdventureWorks.Production.Product Như bạn thấy, hai câu lệnh SELECT tạo hai sơ đồ lưu cache khác sơ đồ thực thi lần (exec_count number) Sở dĩ chuyện xảy hai câu lệnh SELECT khơng hồn tồn giống Câu lệnh SELECT thứ hai khác chút có thêm ghi Ngồi ra, bạn để ý kích cỡ sơ đồ: 40960 byte - kích cỡ nhớ lớn dành cho câu lệnh T-SQL đơn giản Vì thế, bạn nên cẩn thận thêm ghi vào code, tránh để máy chủ tạo nhiều sơ đồ thừa Một nguyên nhân khác dẫn đến việc tạo nhiều sơ đồ lưu cache cho câu lệnh T-SQL giống khoảng trắng Sau hai câu lệnh giống ngoại trừ khoảng trắng: SELECT * FROM AdventureWorks.Production.Product GO SELECT * FROM AdventureWorks.Production.Product GO Như bạn thấy, câu lệnh thứ hai có chứa vài khoảng trắng thừa FROM tên đối tượng Các khoảng trắng thừa nguyên nhân khiến máy chủ SQL nghĩ hai câu lệnh khác nhau, từ dẫn đến việc tạo hai sơ đồ lưu cache khác cho hai câu lệnh Trong trường hợp này, hiển nhiên bạn dễ dàng nhận khác biệt hai câu lệnh lẽ khoảng trắng nằm câu lệnh Thế bạn vô tình thêm khoảng trắng phía trước mệnh đề SELECT phía cuối câu lệnh, bạn khơng thể nhận khoảng trắng câu lệnh trông giống hệt Tuy nhiên, máy chủ SQL nhìn thấy, tạo nhiều sơ đồ lưu cache khoảng trắng thừa Khi máy chủ SQL nhìn vào đoạn code, đem so sánh với sơ đồ sẵn có cache thủ tục Nếu xác định đoạn code giống hệt sơ đồ lưu cache sẵn có, máy chủ SQL khơng cần biên dịch lưu sơ đồ vào nhớ Máy chủ SQL tái sử dụng sơ đồ có cache đoạn code giống Để tối ưu hóa mã nguồn, bạn cần đảm bảo việc tái sử dụng sơ đồ lưu cache Khi bạn xây dựng mã nguồn ứng dụng có sử dụng câu lệnh T-SQL mà không dùng SP, bạn cần phải cẩn trọng để đảm bảo nhận sơ đồ có khả tái sử dụng cao Chúng ta thường dùng phương pháp copy - paste muốn sử dụng đoạn code phần khác ứng dụng Tuy nhiên bạn thấy ví dụ trên, bạn cần cẩn thận thực thao tác Chỉ cần vài khoảng trắng thừa ghi nhỏ khiến máy chủ SQL tạo nhiều sơ đồ lưu cache khác Nâng hiệu suất lên tối đa giảm thiểu nhớ Để tối ưu hóa mã nguồn, quan tâm đến thiết kế sở liệu thơi chưa đủ, bạn cần để ý đến chi tiết nhỏ chẳng hạn khoảng trắng ghi Nếu bạn không lưu tâm đến chi tiết quanh câu lệnh T-SQL giống nhau, bạn khiến máy chủ SQL tạo nhiều sơ đồ lưu cache Có thể việc có vài sơ đồ lưu cache thừa nhớ quan trọng, nhiên lập trình viên, cần cố gắng hết khả để nâng cao hiệu suất máy chủ giảm thiểu tài nguyên sử dụng Và cách để thực mục tiêu trên, tránh tạo nhiều sơ đồ lưu cache cho câu lệnh T-SQL giống   ... nhanh Áp dụng thói quen tốt để code nhanh Có nhiều lý để tập luyện cho quen với lối viết code tối ưu Khi bạn áp dụng thành thạo thủ thuật nhỏ nêu biến thành thói quen viết câu lệnh T-SQL, bạn tránh... kiện WHERE Vì câu lệnh T-SQL động bao gồm câu lệnh SELECT ban đầu mệnh đề WHERE khơng cịn cần điều kiện IS NULL để ràng buộc liệu Cuối sử dụng SP “sp_executesql” để thực thi câu lệnh T-SQL động... thao tác thừa Phần hai tập trung vào việc làm để tối ưu hóa thủ tục lưu trữ đa Những thói quen tốt viết câu lệnh T-SQL (Phần 1) Thủ tục lưu trữ đa Trước bước vào vấn đề làm để tối ưu hóa thủ tục

Ngày đăng: 19/01/2014, 21:20

TỪ KHÓA LIÊN QUAN

w