Sau khi đọc truy vấn SQL chậm, không biết cách tối ưu hóa , tôi đã suy nghĩ về hiệu suất chung của các truy vấn. Chắc chắn, chúng ta cần kết quả của bảng đầu tiên (khi các bảng khác được nối) nhỏ nhất có thể trước khi tham gia (tham gia bên trong cho câu hỏi này) để làm cho các truy vấn của chúng tôi nhanh hơn một chút.
Ví dụ, nên:
SELECT *
FROM ( SELECT * FROM table1 WHERE col = @val ) t
INNER JOIN table2 ON col = col2
Tốt hơn / nhanh hơn:
SELECT *
FROM table1
INNER JOIN table2 ON col = col2
WHERE table1.col = @val
Lý thuyết của tôi là như sau (đây có thể không phải là cách triển khai chính xác, tôi đang cố nhớ từ một cuốn sách nội bộ SQL Server 2008 mà tôi đã đọc (MSFT Press)):
- Bộ xử lý truy vấn trước tiên lấy bảng bên trái (bảng1)
- Tham gia bảng thứ hai (bảng2) và tạo thành một sản phẩm cartesian trước khi lọc ra các hàng cần thiết (nếu có)
- Sau đó thực hiện các mệnh đề WHERE, ORDER BY, GROUP BY, HAVING với câu lệnh SEELCT cuối cùng.
Vì vậy, nếu trong câu lệnh số 1 ở trên, bảng nhỏ hơn, công cụ SQL có ít việc phải làm hơn khi tạo các sản phẩm cartesian. Sau đó, khi bạn đạt đến câu lệnh where, bạn có tập kết quả giảm từ đó sẽ lọc trong bộ nhớ.
Tôi có thể đi xa đến mức không thực tế. Như tôi đã nói, đó là một lý thuyết.
Suy nghĩ của bạn?
Lưu ý : Tôi chỉ nghĩ về câu hỏi này và chưa có cơ hội tự mình thực hiện bất kỳ bài kiểm tra nào.
Lưu ý 2 : Được gắn thẻ là Máy chủ SQL vì tôi không biết gì về việc triển khai MySql, v.v ... Vui lòng trả lời / nhận xét nào.