Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 40 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
40
Dung lượng
2,24 MB
Nội dung
Những thóiquentốtkhi viết câulệnhT-SQL Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com Hiệu năng ứng dụng phụ thuộc vào rất nhiều yếu tố, trong đó có một yếu tố rất quan trọng đó là thời gian để máy chủ SQL xử lý câulệnh T-SQL. Đôi khi thiết kế cơ sở dữ liệu và các yêu cầu truy vấn phức tạp làm cản trở tốc độ thực thi của các câulệnh T-SQL. Cách viết code từng câulệnhT-SQL cũng có thể khiến máy chủ SQL phải làm việc nhiều hơn để xử lý truy vấn. Bài viết sau đây sẽ giới thiệu cho bạn những thóiquentốt nên tập luyện khiviết code T- SQL. Qua đó bạn có thể hiểu làm thế nào để viết các câu truy vấn tối ưu, tận dụng tốt tài nguyên máy chủ SQL và cải thiện hiệu suất. Ghi rõ tên cột trong câulệnh SELECT SELECT * FROM MyTable; Bạn đã từng viếtcâulệnh như trên bao nhiêu lần? Việc sử dụng dấu sao (*) cho cơ sở dữ liệu biết rằng bạn muốn trả về tất cả các cột từ bảng (hoặc các bảng) được khai báo trong mệnh đề FROM. Đây Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com không phải là một thóiquentốt ngay cả khi bạn muốn tất cả các cột được trả về ứng dụng. Tốt hơn bạn nên ghi rõ tên từng cột trong bảng như sau: SELECT ID, Description, DateModified FROM MyTable; Việc khai báo rõ ràng tên các cột trong câulệnh SELECT mang lại rất nhiều lợi ích. Thứ nhất, máy chủ SQL sẽ chỉ trả về dữ liệu cần thiết cho ứng dụng chứ không phải là một đống dữ liệu mà trong đó có nhiều thứ ứng dụng của bạn không hề cần đến. Bằng cách chỉ yêu cầu trả về những dữ 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 hiện để thu thập tất cả các cột của thông tin bạn yêu cầu. Ngoài ra, nhờ không sử dụng dấu sao (*) 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 các dữ liệu liên quan đến câulệnh SELECT tới ứng dụng. Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com Trong trường hợp bạn dùng dấu sao (*) và có một ai đó thêm cột mới vào bảng, ứng dụng của bạn sẽ bắt đầu tiếp nhận dữ liệu cho cột này mà không thay đổi mã nguồn ứng dụng. Nếu ứng dụng của bạn chờ đợi số lượng cột nhất định được trả về, nó sẽ bị lỗi ngay khi có người bổ sung cột mới vào một trong các bảng tham chiếu. Bằng việc khai báo rõ ràng tên từng cột trong câulệnh SELECT, ứng dụng sẽ luôn nhận được số lượng cố định các cột trả về, ngay cả khi có người thêm cột mới vào các bảng tham chiếu trong câulệnh SELECT. Nhờ vậy, bạn đã giúp ứng dụng tránh khỏi những nguy cơ tiềm tàng liên quan đến các thay đổi cơ sở dữ liệu có thể xảy đến với bất kỳ bảng nào bạn tham chiếu tới trong câulệnh SELECT. Ghi rõ tên cột trong câulệnh INSERT Cũng giống như trên, bạn nên chỉ rõ tên từng cột bạn muốn chèn dữ liệu vào trong câulệnh INSERT. Đừng viếtcâulệnh INSERT như sau: Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com INSERT INTO MyTable VALUES ('A','B','C'); Khi bạn viết kiểu này, máy chủ SQL đòi hỏi chỉ đúng ba cột được định nghĩa trong bảng MyTable, và giá trị “A” sẽ được 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 ai đó thêm mới một cột vào bảng MyTable, ứng dụng của bạn sẽ bị lỗi: Msg 213, Level 16, State 1, Line 1 Column name or number of supplied values does not match table definition. (Tên cột hoặc số lượng giá trị không khớp với bảng) Vì thế, thay vì viếtcâulệnh INSERT như trên, bạn nên viết như sau: INSERT INTO MyTable(So1, So2, So3) VALUES ('A','B','C'); Bằng cách viết trên, khi ai đó thêm mới một cột tên là “So4” vào bảng MyTable, câulệnh INSERT vẫn tiếp Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com tục làm việc với điều kiện cột “So4” được tạo với giá trị mặc định DEFAULT hoặc cho phép NULL. Thêm tiền tố cho wildcard để tăng tốc tìm kiếm Sử dụng các ký tự thay thế (wildcard) thích hợp có thể 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 trong bảng AdventureWorks.Person.Contact tất cả LastNames kết thúc bằng “sen”. Giả dụ rằng bạn đã xây dựng một chỉ mục trên cột LastName. Nếu bạn viếtcâulệnh tìm kiếm như sau: SELECT Distinct LastName FROM Person.Contact WHERE LastName LIKE '%sen' Câulệnh sử dụng ký tự phần trăm (%) để thay thế cho không hoặc nhiều ký tự được theo sau bởi chuỗi “sen” trong trường LastName. Điều này khiến máy chủ SQL thực hiện thao tác quét chỉ mục nhằm tìm kiếm tất cả các tên kết thúc bằng “sen” để giải quyết Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com câu truy vấn. Việc này rất có ý nghĩa bởi cho đến khi toàn bộ bảng được quét, máy chủ SQL không thể đảm bảo rằng đã tìm ra toàn bộ các bản ghi có LastName kết thúc bằng “sen”. Ngoài ra, nếu bạn đang tìm kiếm các bản ghi có LastName dài đúng sáu ký tự và kết thúc bằng “sen”, bạn có thể viếtcâulệnh tìm kiếm như sau: SELECT Distinct LastName FROM Person.Contact WHERE LastName LIKE '___sen’ Ở đây, câulệnh sử dụng ký tự gạch dưới (_) để thay thế cho một ký tự đơn. Ví dụ này tương tự với ví dụ ở phần trên và sử dụng thao tác quét chỉ mục để giải quyết. Một lần nữa, máy chủ SQL biết rằng cần phải quét toàn bộ chỉ mục trước khi đảm bảo đã tìm thấy tất cả các tên dài sáu ký tự và kết thúc bằng “sen” trong bảng Person.Contact. Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com Máy chủ SQL có thể trả về kết quả nhanh hơn nếu nó không phải đọc toàn bộ chỉ mục bằng cách sử dụng cơ chế quét. Máy chủ SQL đủ thông minh để nhận biết khi bạn đặt thêm tiền tố trước ký tự thay thế (%, _, v.v ), nó có thể dùng một thao tác tìm kiếm chỉ mục để tiến hành giải quyết tiêu chí tìm kiếm. Sau đây là một ví dụ về câulệnh tìm kiếm yêu cầu trả về tất cả bản ghi có LastName bắt đầu bằng ký tự “A” và kết thúc bằng “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 (%) trong câulệnh tìm kiếm, bạn đã cho máy chủ SQL biết rằng nó có thể sử dụng một thao tác tìm kiếm chỉ mục để giải quyết câu truy vấn. Một khi Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com máy chủ SQL đọc tới bản ghi cuối cùng có LastName bắt đầu bằng ký tự “A”, nó biết rằng không còn bản ghi nào có LastName bắt đầu bằng ký tự “A” nữa và sẽ dừng lại. Không phải tất cả ký tự thay thế đều cần thêm tiền tố để máy chủ SQL dùng một thao tác tìm kiếm chỉ mục nhằm giải quyết truy vấn. Sau đây là một ví dụ trong đó câulệnh sử dụng biểu thức thể hiện một tập hợp ký tự thay thế và vẫn cho phép máy chủ SQL giải quyết câu truy vấn bằng cách dùng một thao tác tìm kiếm chỉ mục: SELECT Distinct LastName FROM Person.Contact WHERE LastName LIKE '[A-M]%sen' CâulệnhT-SQL trên tìm kiếm toàn bộ LastName bắt đầu bằng một ký tự bất kỳ trong khoảng từ “A” đến Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com “M” và kết thúc bằng “sen”. Các cú pháp sử dụng ký tự thay thế khác trong đó chỉ rõ tập hợp các ký tự cũng có thể gọi thao tác quét chỉ mục để giải quyết tiêu chí tìm kiếm. Chỉ dùng DISTINCT khi cần Đặt từ khóa DISTINCT trong câulệnh SELECT sẽ loại bỏ các kết quả trùng lặp trong số những kết quả trả về của câu truy vấn. Nó khiến máy chủ SQL phải thực hiện thêm thao tác SORT để sắp xếp dữ liệu nhằm nhận biết và loại bỏ các bản trùng lặp. Vì thế, nếu bạn biết trước các kết quả trả về sẽ không trùng lặp thì không nên dùng từ khóa DISTINCT trong câulệnh T-SQL. Với việc sử dụng từ khóa DISTINCT trong câu truy vấn, bạn đã yêu cầu máy chủ SQL thực hiện thao tác sắp xếp vào loại bỏ các kết quả trùng lặp. Đây là phần công việc phụ thêm của máy chủ Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com [...]... để tập luyện cho mình quen với lối viết code tối ưu Khi bạn áp dụng thành thạo những thủ thuật nhỏ nêu trên và biến nó thành thói quen mỗi khi viếtcâulệnh T-SQL, bạn sẽ tránh được rủi ro có thể xảy ra khi cơ sở dữ liệu thay đổi, đồng thời cải thiện hiệu suất làm việc của máy chủ nhờ giảm thiểu lưu lượng truyền tải qua mạng Những thủ thuật rất đơn giản này còn giúp bạn tận dụng tốt hơn tài nguyên máy... tốn những nguồn tài nguyên giá trị như CPU nhằm biên dịch code T-SQLKhi 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âulệnhT-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ếtcâulệnhT-SQL để tăng cường tái sử Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com dụng sơ đồ lưu cache với những đoạn T-SQL. .. 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ệnhT-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 TSQL Sau đây là một ví dụ gồm hai câulệnhT-SQL khác nhau: SELECT * FROM AdventureWorks.Production.Product... WHERE Vì thế câulệnhT-SQL động cơ bản chỉ bao gồm câulệnh SELECT ban đầu và mệnh đề WHERE không còn cần điều kiện IS NULL để ràng buộc dữ liệu nữa Cuối cùng tôi sử dụng SP “sp_executesql” để thực thi câulệnhT-SQL động thông số hóa Để thực hiện Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com điều này, tôi truyền năm tham số vào SP hệ thống Tham số đầu tiên là biến T-SQL động... đâ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ếtcâulệnhT-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... “sp_executesql” cho phép bạn phát triển câulệnhT-SQL có chứa tham số, đồng thời cho phép bạn định nghĩa và truyền giá trị cho các tham số tới SQL động bằng cách truyền tham số tới SP “sp_executesql” khi chạy SP này CâulệnhT-SQL được thực thi theo cách này thường gọi là SQL được thông số hóa Có nhiều lý do để sử dụng SQL được thông số hóa, nhưng trong khuôn khổ bài viết này chúng ta chỉ tập trung vào... nguyên máy chủ trong quá trình xử lý câulệnh Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com Để nâng cao hiệu suất máy chủ SQL và giảm thiểu các lỗi tiềm tàng cho ứng dụng, chúng ta cần phải tập viết code câulệnhT-SQL một cách tối ưu nhất Trong phần đầu của bài viết, các bạn đã được giới thiệu một số thủ thuật hữu ích giúp máy chủ giảm bớt những thao tác thừa Phần hai này sẽ... Như bạn thấy, tôi có hai câulệnhT-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âulệnhT-SQL trên, tôi sẽ chạy... hình của 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 như sau: Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com Ở đây bạn có thể thấy đối với mỗi tham số đơn được truyền vào, máy chủ quyết định sử dụng thao tác “quét chỉ mục” Câulệnh SELECT của SP ràng buộc cột duy nhất @SalesOrderID... tục bằng cách chạy lệnh DBCC Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com 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 . xử lý câu lệnh T-SQL. Đôi khi thiết kế cơ sở dữ liệu và các yêu cầu truy vấn phức tạp làm cản trở tốc độ thực thi của các câu lệnh T-SQL. Cách viết code từng câu lệnh T-SQL cũng có thể khi n. truy vấn. Bài viết sau đây sẽ giới thiệu cho bạn những thói quen tốt nên tập luyện khi viết code T- SQL. Qua đó bạn có thể hiểu làm thế nào để viết các câu truy vấn tối ưu, tận dụng tốt tài nguyên. Những thói quen tốt khi viết câu lệnh T-SQL Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com Hiệu