Giới thiệu
Trong lĩnh vực phát triển phần mềm, tối ưu hóa truy vấn SQL luôn là một chủ đề nóng. Hôm nay, chúng ta sẽ cùng Mít Đặc và Biết Tuốt trao đổi về những lời đồn đại xung quanh vấn đề này và làm rõ những hiểu lầm phổ biến.
Lời đồn số 1: Sử dụng SELECT * chậm hơn SELECT cụ thể
Mít Đặc: Hi anh Tuốt, tôi nghe nói SELECT * chậm hơn khi so với việc chỉ định rõ ràng các trường cần lấy trong truy vấn. Ý anh nghĩ sao?
Biết Tuốt: Đúng là SELECT * thường chậm hơn, nhưng không phải lúc nào cũng như vậy. Ở một số trường hợp đặc biệt, nếu câu lệnh chỉ chọn các trường có trong chỉ mục (index), thì nó sẽ nhanh hơn SELECT * tới 100 lần.
Mít Đặc: Thú vị quá! Vậy ý nghĩa của điều này là gì?
Biết Tuốt: Khi cơ sở dữ liệu xử lý truy vấn, nếu dữ liệu cần lấy đã có đủ trong chỉ mục, nó sẽ không cần truy cập vào bảng thực, từ đó tiết kiệm thời gian và tài nguyên.
Lời đồn số 2: COUNT(1) nhanh hơn COUNT(*)
Mít Đặc: Nghe nói là COUNT(1) sẽ hiệu quả hơn COUNT(*), điều này có đúng không?
Biết Tuốt: Thực tế thì không đúng như vậy đâu, vì COUNT(*) và COUNT(1) thường cho ra cùng một hiệu suất.
Lời đồn số 3: Chọn các trường có độ selectivity cao cho chỉ mục
Mít Đặc: Có một mẹo thú vị khác là chọn các trường có độ selectivity cao vào chỉ mục trước phải không?
Biết Tuốt: Chính xác, những trường này có độ trùng lặp thấp nên giúp tăng hiệu suất truy vấn. Nhưng không phải lúc nào cũng đúng. Cần xem xét bối cảnh và câu truy vấn thực tế của bạn.
Trường hợp sử dụng một chỉ mục hợp lý
Mít Đặc: Thế nếu trường hợp chúng ta muốn tìm kiếm theo OrganizationID, thì sao?
Biết Tuốt: Khi đó, bạn nên đưa OrganizationID lên đầu chỉ mục. Mục tiêu là đảm bảo rằng chỉ mục sẽ phục vụ tốt cho các truy vấn có thể xảy ra.
Reindex có cần thiết không?
Mít Đặc: Vậy còn việc reindex, có cần thiết không?
Biết Tuốt: Thực tế thì việc reindex chỉ phát huy tác dụng ở một số trường hợp. Nó hỗ trợ cho các câu lệnh tốn kém như Full Index Scan, trong khi đối với các câu lệnh lấy một vài bản ghi, reindex sẽ không mang lại nhiều giá trị.
Dynamic SQL có chậm hơn SQL thường không?
Mít Đặc: Cuối cùng, tôi nghe rằng Dynamic SQL sẽ chậm hơn SQL thông thường đúng không?
Biết Tuốt: Đúng là Dynamic SQL có thể chậm hơn vì nó không được cache execution plan, nhưng nếu bạn sử dụng parameter cho Dynamic SQL thì hiệu suất sẽ không bị ảnh hưởng quá nhiều.
Kết luận
Chúng ta đã cùng nhau khám phá những lời đồn về tối ưu hóa SQL. Rất nhiều thông tin là đúng nhưng cũng có những điều cần phải lưu ý. Hy vọng bài viết này sẽ giúp bạn làm sáng tỏ nhiều điều về SQL. Cảm ơn bạn đã theo dõi!
source: viblo