2012-05-15 25 views
5

Tôi có truy vấn tự tham gia kép trong đó hiệu suất bị giảm nghiêm trọng khi giá trị tìm kiếm được đổi chỗ.Hiệu suất truy vấn SQL Suy giảm tùy thuộc vào thứ tự của giá trị tìm kiếm

-- 500,000 i/o & 500ms execution 
select 
    fooA.ID 
    , fooB.ID 
from 
    foo AS fooA 
    INNER JOIN bar AS barA ON fooA.barID = barA.barID 
    INNER JOIN foo AS fooB ON fooA.fooID = fooB.fooID -- self join 
    INNER JOIN bar AS barB ON fooB.barID = barB.barID 
where 
    barA.value = 'xyz' 
    AND barB.value = '60' 

-- 5,000 i/o & 5ms execution 
select 
    fooA.ID 
    , fooB.ID 
from 
    foo AS fooA 
    INNER JOIN bar AS barA ON fooA.barID = barA.barID 
    INNER JOIN foo AS fooB ON fooA.fooID = fooB.fooID -- self join 
    INNER JOIN bar AS barB ON fooB.barID = barB.barID 
where 
    barA.value = '60' 
    AND barB.value = 'xyz' 
  • Giá trị "xyz" được niêm yết 150.000 lần trong "thanh" bảng.
  • Giá trị "60" được liệt kê 500 lần trong bảng "thanh".
  • Kế hoạch truy vấn giống nhau, ngoại trừ vòng lặp bên trong nhiều nhất trả về 150.000 hàng hoặc 500 hàng tùy thuộc vào giá trị tìm kiếm nào được liệt kê trước tiên.
  • Các tìm kiếm thực hiện tìm kiếm trên các chỉ mục không được nhóm.
  • Thống kê được cập nhật trên cả hai bảng với FULLSCAN.

Tại sao trình tối ưu hóa truy vấn SQL không xác định chính xác rằng trong cả hai trường hợp, phép nối bên trong nhất của kế hoạch truy vấn phải là số có ít hàng nhất?

+0

Sử dụng các tiêu chí giới hạn số lượng hàng trong truy vấn của bạn nhất luôn là đầu tiên. Một nguyên tắc chung của ngón cái. – JonH

+1

Câu trả lời có thể có: tham số truy vấn, tham số đánh hơi và lập kế hoạch sử dụng lại. –

+0

Bạn có thể tạo các khóa chính của id trên bảng foo và thanh không? –

Trả lời

3

Máy chủ SQL không biên dịch lại truy vấn mỗi khi được thực hiện. Nó làm điều này một lần, và nó tối ưu hóa cho các giá trị chính xác mà nó nhìn thấy lần đầu tiên. Tôi đoán bạn có một kế hoạch không may được lưu trữ.

Thử thêm OPTION (RECOMPILE) vào cuối.

+0

Tôi đã thêm điều này và không có thay đổi. Số hàng được ước tính từ kết nối bên trong nhiều nhất là 2.500 cho cả hai kế hoạch truy vấn, nhưng thực tế là khác nhau rất nhiều. –

+0

Điều đó thật kỳ lạ. Ước lượng số lượng các chỉ số về bình đẳng đối sánh thường rất chính xác. Các bảng bạn đang tìm kiếm có chứa số lượng hàng rất cao với rất ít bản sao không? – usr

+0

Tôi thực sự không nhìn thấy bất cứ điều gì ở tất cả có thể gây ra rắc rối ở đây. Bạn có thể đăng ảnh chụp màn hình của hai kế hoạch thực hiện thực tế không? – usr

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