2012-06-13 22 views
25

Tôi hiện đang thực hiện một số thử nghiệm để xác định tác động hiệu suất của việc bao gồm chỉ mục trên một cột nhất định trong SQL Server 2005.Làm cách nào để buộc truy vấn không sử dụng chỉ mục trên một bảng nhất định?

Bộ dữ liệu thử nghiệm tôi đang sử dụng có khoảng 72 triệu hàng (khoảng 6 GB dữ liệu). Để thực sự kiểm tra hiệu suất của chỉ mục tôi cần để có thể so sánh hiệu suất có và không có chỉ mục ở đó.

Đó là tất cả tốt và tốt, nhưng việc tạo chỉ mục ngay từ đầu không phải là hoạt động rẻ. Nếu tôi muốn kiểm tra bảng mà không có chỉ mục, tôi cần, ít nhất, hãy vô hiệu hóa chỉ mục. Để kiểm tra với chỉ mục, tôi cần phải kích hoạt lại nó mất khá nhiều thời gian.

Có cách nào mà tôi có thể buộc SQL Server 2005 bỏ qua một chỉ mục nhất định khi nó thực hiện truy vấn không? Tôi không muốn phải vô hiệu hóa chỉ mục chỉ để kiểm tra một truy vấn vì phải mất một thời gian dài để vô hiệu hóa chỉ mục.

+1

[Bạn cũng có thể xem 'DBCC AUTOPILOT'] (http://blogs.solidq.com/fabianosqlserver/post.aspx?id=39&title=undocumented,%22statistics_only%22,%20%22dbcc%20autopilot%22 % 20 và% 20% 22set% 20autopilot% 22) –

Trả lời

37
SELECT * 
FROM MyTable WITH (INDEX(0)) 
WHERE MyIndexedColumn = 0 

Truy vấn thường sẽ sử dụng chỉ mục trên MyIndexedColumn, nhưng do gợi ý bảng, thay vào đó bảng sẽ thay thế.


SELECT * 
FROM MyTable WITH (INDEX(IndexName)) 
WHERE MyIndexedColumn = 0 

Query thường sử dụng các chỉ mục trên MyIndexedColumn, nhưng do sự gợi ý bảng, nó sẽ thay vì sử dụng các chỉ số tên IndexName.

+0

Vì vậy, nếu tôi có 'MyTable' các chỉ mục' PK_MyTable' và 'IX_MyTable_MyIndexedColumn', tôi chỉ có thể sử dụng' WITH (INDEX (PK_MyTable)) 'để ép nó * không * thành sử dụng chỉ mục trên 'MyIndexedColumn'? –

+1

Có. Kiểm tra ExecutionPlan để xác nhận hành vi này. http: // stackoverflow.com/questions/7359702/how-do-i-get-a-truy vấn-thi hành-kế hoạch –

+0

Còn các trường hợp khi các chỉ mục không nhóm khác hiện diện thì sao? Làm thế nào để làm cho máy chủ sql sử dụng phần còn lại trên chỉ mục chứ không phải chỉ mục mới được tạo ra, để kiểm tra xem chỉ mục mới giúp truy vấn như thế nào? – Satyajit

-2

Bạn có thể vô hiệu hóa chỉ mục bạn không muốn sử dụng trong cùng một giao dịch mà bạn đang chạy mã thử nghiệm, chỉ cần đảm bảo khôi phục giao dịch ở cuối. Điều này đảm bảo mã kiểm tra sẽ không sử dụng chỉ mục nhưng ngăn không cho chỉ mục thực sự bị vô hiệu hóa.

BEGIN TRANSACTION 

    ALTER INDEX [MyIndex] ON MyTable DISABLE; 

    EXEC TestCode; 

ROLLBACK 

Điều này hoạt động tốt hơn nếu bạn sử dụng mã kiểm tra sử dụng một số chỉ mục vào các thời điểm khác nhau và bạn muốn thử nghiệm thêm một chỉ mục mới.

+4

Truy vấn của bạn đang khóa lược đồ cơ sở dữ liệu hoàn chỉnh cho đến khi tất cả các lô trong giao dịch được thực hiện! –

+0

Tôi không bỏ phiếu nhưng tôi phải đồng ý với Milan. Không chỉ vậy, nhưng nhiều lần tôi phải kiểm tra một cái gì đó như thế này trong một cơ sở dữ liệu sản xuất và không có cách nào DBAs sẽ cho phép tôi thay đổi một chỉ mục trong sản xuất. –

5

Tôi đang làm việc với tất cả các loại DB khác nhau và không bao giờ có thể nhớ gợi ý cụ thể khi tôi cần. Vì vậy, tôi đang sử dụng một phương pháp SQL thuần túy (hiện tại) làm việc với tất cả các DB mà vượt qua con đường của tôi.

Ý tưởng chỉ là làm cho DB không thể sử dụng chỉ mục cụ thể bằng cách làm xáo trộn biểu thức tương ứng trong SQL. Ví dụ.

SELECT * 
    FROM MyTable 
WHERE MyIndexedColumn + 0 = 0 

Tương tự, bạn có thể thêm chuỗi trống vào giá trị chuỗi. Trình tối ưu hóa hiện tại không giải quyết các biểu thức như vậy không thể sử dụng chỉ mục trên (MyIndexedColumn).

Đây thực sự là mẫu chống tôi mô tả trong sách của mình. Dưới đây là một số trang trên trang về math in SQL

Nó chắc chắn đủ tốt để thử nghiệm đặc biệt. Trong mã sản xuất, gợi ý là biểu cảm hơn tất nhiên!

+1

Đó là khủng khiếp thông minh, nhưng dường như tận dụng lợi thế của một thiếu hơn là một tính năng tài liệu, và có lẽ không phải là lựa chọn tốt nhất, tùy thuộc vào nhu cầu. – Paul

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