Thông tin tài liệu:
Những thói quen tốt khi viết câu lệnh T-SQL (Phần 1) 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âu lệnh T-SQL.
Nội dung trích xuất từ tài liệu:
Những thói quen tốt khi viết câu lệnh T-SQL (Phần 1)Những thói quen tốt khi viết câu lệnh T-SQL (Phần 1)Hiệu năng ứng dụng phụ thuộc vào rất nhiều yếu tố, trong đó có một yếutố rất quan trọng đó là thời gian để máy chủ SQL 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ảntrở 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ệ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ói quen tốt nêntập luyện khi viết code T-SQL. Qua đó bạn có thể hiểu làm th ế nào để viếtcá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ệnhiệu suất.Ghi rõ tên cột trong câu lệnh SELECTSELECT * FROM MyTable;Bạn đã từng viết câu lệ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ấtcả các cột từ bảng (hoặc các bảng) được khai báo trong mệnh đề FROM.Đây không phải là một thói quen tố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 FROMMyTable;Việc khai báo rõ ràng tên các cột trong câu lệnh SELECT mang lại rấtnhiề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ữngdữ 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áychủ 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êucầu. Ngoài ra, nhờ không sử dụng dấu sao (*) nên bạn đã giảm thiểu lưulượ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âu lệnh SELECT tới ứng dụng.Trong trường hợp bạn dùng dấu sao (*) và có một ai đó thêm cột mới vàobả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ổ sungcột mới vào một trong các bảng tham chiếu. Bằng việc khai báo rõ ràngtên từng cột trong câu lệ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ácbảng tham chiếu trong câu lệnh SELECT. Nhờ vậy, bạn đã giúp ứng dụngtrá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âu lệnhSELECT.Ghi rõ tên cột trong câu lệnh INSERTCũ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ệuvào trong câu lệnh INSERT. Đừng viết câu lệnh INSERT như sau: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 địnhnghĩ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àobảng MyTable, ứng dụng của bạn sẽ bị lỗi:Msg 213, Level 16, State 1, Line 1Column name or number of supplied values does notmatch 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ết câu lệ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ảngMyTable, câu lệnh INSERT vẫn tiếp 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ếmSử dụng các ký tự thay thế (wildcard) thích hợp có thể cải thiện hiệu suấtcâu truy vấn. Chẳng hạn bạn muốn tìm kiếm trong bảngAdventureWorks.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ạnviết câu lệnh tìm kiếm như sau:SELECT Distinct LastNameFROM Person.ContactWHERE LastName LIKE %senCâu lệnh sử dụng ký tự phần trăm (%) để thay thế cho không hoặc nhiềuký tự đ ược theo sau bởi chuỗi “sen” trong trường LastName. Điều nàykhiế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 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áuký tự và kết thúc bằng “sen”, bạn có thể viết câu lệnh tìm kiếm như sau:SELECT Distinct LastNameFROM Person.ContactWHERE LastName LIKE ___sen’Ở đây, câu lệ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étchỉ 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éttoà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.Máy chủ SQL có thể trả về kết quả nhanh hơn nếu nó không phải đọctoàn bộ chỉ mục bằng cách sử dụng cơ chế quét. Máy chủ SQL đủ ...