2011-07-07 29 views
6

Tôi có một bảng có tên là Quy trình làm việc. Nó có 37M hàng trong đó. Có một khóa chính trên cột ID (int) cộng với một cột bổ sung. Cột ID là cột đầu tiên trong chỉ mục.Tại sao một chỉ mục cụ thể không được sử dụng trong truy vấn?

Nếu tôi thực hiện các truy vấn sau đây, PK không được sử dụng (trừ khi tôi sử dụng một gợi ý index)

Select Distinct(SubID) From Workflow Where ID >= @LastSeenWorkflowID 

Nếu tôi thực hiện truy vấn này để thay thế, PK được sử dụng

Select Distinct(SubID) From Workflow Where ID >= 786400000 

tôi nghi ngờ vấn đề là sử dụng giá trị tham số trong truy vấn (mà tôi phải làm). Tôi thực sự không muốn sử dụng gợi ý chỉ mục. Có một cách giải quyết cho điều này?

+0

Phiên bản nào của SQL Server? –

+0

Đây có phải là chỉ số nonclustered không? Có một chỉ số nhóm? – JNK

+0

@JNK - SQL Server 2008 và PK là chỉ mục nhóm –

Trả lời

3

Vui lòng đăng (các) kế hoạch thực thi, cũng như định nghĩa bảng chính xác, bao gồm tất cả các chỉ mục.

Khi bạn sử dụng biến, trình tối ưu hóa không biết truy vấn chọn lọc sẽ có, @LastSeenWorkflowID có thể lọc ra tất cả trừ một vài hàng cuối cùng trong Quy trình làm việc hoặc có thể bao gồm tất cả. Kế hoạch được tạo ra phải hoạt động trong cả hai tình huống. Có một ngưỡng mà phạm vi tìm kiếm trên chỉ số nhóm đang trở nên đắt hơn so với quét toàn bộ trên chỉ mục không được nhóm, đơn giản vì chỉ mục nhóm được mở rộng hơn nhiều (bao gồm mọi cột ở cấp độ lá) và do đó nhiều trang hơn để lặp lại. Kế hoạch được tạo, xem xét giá trị không xác định cho @LastSeenWorkflowID, có khả năng vượt qua ngưỡng đó trong việc ước tính chi phí của chỉ mục nhóm được tìm kiếm và do đó, nó chọn quét qua chỉ mục không được nhóm.

Bạn có thể cung cấp một chỉ số hẹp được đặc biệt nhằm truy vấn này:

CREATE INDEX WorkflowSubId ON Workflow(ID, SubId); 

hay:

CREATE INDEX WorkflowSubId ON Workflow(ID) INCLUDE (SubId); 

một chỉ số như vậy là quá tốt-to-pass cho truy vấn của bạn, không có quan trọng giá trị của @LastSeenWorkflowID.

2

Giả sử PK của bạn là một bản sắc HOẶC luôn lớn hơn 0, có lẽ bạn có thể thử này:

Select Distinct(SubID) 
From Workflow 
Where ID >= @LastSeenWorkflowID 
    And ID > 0 

Bằng cách thêm điều kiện thứ 2, nó có thể gây ra các ưu để sử dụng một chỉ mục tìm kiếm.

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