2010-01-28 24 views
6

Nói rằng tôi có một truy vấn như hình dưới đây:Thứ tự JOIN có tạo sự khác biệt không?

SELECT t1.id, t1.Name 
FROM Table1 as t1 --800,000 records 
INNER JOIN Table2 as t2 --500,000 records 
ON t1.fkID = t2.id 
INNER JOIN Table3 as t3 -- 1,000 records 
ON t1.OtherId = t3.id 

tôi sẽ thấy một sự cải thiện hiệu suất nếu tôi đã thay đổi thứ tự của gia nhập của tôi trên Table2 và Table3. Xem bên dưới:

SELECT t1.id, t1.Name 
FROM Table1 as t1 --800,000 records 
INNER JOIN Table3 as t3 -- 1,000 records 
ON t1.OtherId = t3.id 
INNER JOIN Table2 as t2 --500,000 records 
ON t1.fkID = t2.id 

Tôi nghe nói rằng Trình tối ưu hóa truy vấn sẽ cố gắng xác định thứ tự tốt nhất nhưng không phải lúc nào cũng hoạt động. Phiên bản SQL Server bạn đang sử dụng có tạo sự khác biệt không?

Trả lời

6

Thứ tự tham gia không có sự khác biệt.

Điều gì tạo sự khác biệt là đảm bảo thống kê của bạn được cập nhật.

Một cách để kiểm tra thống kê của bạn là chạy truy vấn trong SSMS và bao gồm kế hoạch thực hiện thực tế. Nếu số hàng được ước tính rất khác với số hàng thực tế được sử dụng bởi bất kỳ phần nào của kế hoạch thực hiện, thì thống kê của bạn đã lỗi thời.

Thống kê được xây dựng lại khi các chỉ mục liên quan được xây dựng lại. Nếu cửa sổ bảo trì sản xuất của bạn cho phép, tôi sẽ cập nhật số liệu thống kê hàng đêm.

này sẽ cập nhật thống kê cho tất cả các bảng trong một cơ sở dữ liệu:

exec sp_MSforeachtable "UPDATE STATISTICS ?" 
+0

Làm cách nào để kiểm tra? Có quy tắc hay về mức độ thường xuyên tôi nên cập nhật số liệu thống kê của mình không? –

+0

Không phải là các hàng Ước tính và thực tế được bao gồm trong kế hoạch Thực thi Thực tế? Vì vậy, nếu nó ước tính 1 hàng và nó trở về hàng ngàn thì tôi có lẽ cần phải cập nhật số liệu thống kê của tôi? Liệu nó có tạo sự khác biệt nếu tôi đang tham gia vào một bảng tạm thời không? –

+0

Ngoài ra, thống kê có tạo sự khác biệt nếu tham gia trên một chế độ xem không? –

1

Optimizer Query dễ dàng nên xử lý những là chính xác cùng một truy vấn, và tìm ra cách tốt nhất để làm việc đó.

Rất nhiều thông tin về số liệu thống kê nhiều hơn số lượng bản ghi. Ví dụ: nếu phần lớn các giá trị trong t1.fkID giống nhau, thông tin này có thể ảnh hưởng rất nhiều đến QO.

3

Thứ tự tham gia tạo sự khác biệt chỉ khi bạn chỉ định OPTION (FORCE ORDER). Nếu không, trình tối ưu hóa sẽ sắp xếp lại truy vấn của bạn theo bất kỳ cách nào mà nó cho là hiệu quả nhất.

Có một số trường hợp nhất định mà tôi thấy rằng tôi cần phải sử dụng FORCE ORDER, nhưng tất nhiên chúng ít và xa. Nếu bạn không chắc chắn, chỉ cần SET STATISTICS [TIME|IO] ON và tự mình xem. Có thể bạn sẽ thấy rằng phiên bản của mình chạy chậm hơn phiên bản được tối ưu hóa nhiều nhất nếu không phải tất cả các trường hợp.

Các vấn đề liên quan