Tải bản đầy đủ (.pdf) (5 trang)

Những thói quen tốt khi viết câu lệnh T-SQL (Phần 1) pps

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (145.29 KB, 5 trang )

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.
Đô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 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ê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 máy chủ SQL và cải thiện
hiệu suất.
Ghi rõ tên cột trong câu lệnh SELECT
SELECT * 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ất
cả 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 FROM
MyTable;
Việc khai báo rõ ràng tên các cột trong câu lệ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â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à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â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ác
bảng tham chiếu trong câu lệ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âu lệnh
SELECT.
Ghi rõ tên cột trong câu lệ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â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 đị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ế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ảng
MyTable, 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ế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ết câu lệnh tìm kiếm như 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 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 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ết câu lệnh tìm kiếm như sau:
SELECT Distinct LastName
FROM Person.Contact
WHERE 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é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.
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âu lệ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âu lệ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 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âu lệ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âu lệnh T-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 “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âu lệ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âu lệ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ủ
SQL và không có ý nghĩa gì nếu tập hợp kết quả của bạn chỉ bao gồm
những bản ghi độc nhất.
Chỉ dùng UNION khi cần
Cũng giống như trường hợp từ khóa DISTINCT, toán tử UNION đòi hỏi
thêm thao tác SORT để máy chủ SQL có thể loại bỏ những kết quả trùng
lặp. Nếu bạn biết trước danh sách kết quả trả về không có kết quả nào
giống nhau thì thao tác sắp xếp mà máy chủ SQL phải thực hiện trở nên
không cần thiết. Bởi vậy khi bạn cần dùng toán tử UNION để nối hai tập
hợp bản ghi với nhau, trong đó các bản ghi là độc nhất không trùng lặp,
tốt hơn bạn nên dùng toán tử UNION ALL. Toán tử UNION ALL không
loại bỏ các bản ghi trùng lặp bởi vậy sẽ giảm nhẹ phần công việc cho máy
chủ SQL trong quá trình xử lý do không phải thực hiện thao tác sắp 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ý
sẽ được thực hiện nhanh hơn.
Áp dụng các thói quen tốt để code nhanh hơn
Có rất nhiều lý do để 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ết câu lệ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
chủ trong quá trình xử lý câu lệnh.

×