2010-10-22 35 views
27

Nên là một câu hỏi khá thẳng về phía trước. Tôi có thể thêm một INDEX vào một biểu thức bảng chung (CTE) không?Thêm INDEX vào CTE

+4

Nó có thể là loại có thể với một số rối tung xung quanh với hướng dẫn kế hoạch. [Bài viết này] (http://explainextended.com/2009/05/28/generating-xml-in-subqueries/) bởi [Quassnoi] (http://stackoverflow.com/users/55159/quassnoi) cho thấy cách sử dụng hướng dẫn lập kế hoạch để nhận kết quả của CTE được lưu trong bộ nhớ cache bằng cách thêm EagerSpool vào gói. Điều này xây dựng một chỉ mục tạm thời trên chúng trong tempdb. –

+1

@Martin Smith: WOW !!! Tôi sẽ có một đọc tốt về điều đó và cố gắng và có được đầu của tôi xung quanh nó tất cả :) –

Trả lời

18

số

CTE là chế độ xem "nội tuyến" tạm thời - bạn không thể thêm chỉ mục vào cấu trúc như vậy.

Nếu bạn cần chỉ mục, hãy tạo chế độ xem thông thường bằng cách chọn CTE của bạn và đặt chế độ xem được lập chỉ mục (bằng cách thêm chỉ mục nhóm vào chế độ xem). Bạn sẽ cần tuân thủ một bộ quy tắc được nêu tại đây: Creating an Indexed View.

+1

Cảm ơn. Tôi không chắc chắn là Bing-ing đã không hiển thị bất cứ điều gì và không Googl-ing. –

+10

Điều gì về Lycos-ing? –

+1

Đối với tôi, Chế độ xem được lập chỉ mục mất 18 giây trước tiên, sau đó 16 giây, sau đó là 14 giây thử lần thứ ba. CTE mất 16 giây đầu tiên thử. Tôi sẽ dính với CTE. BTW, cho tôi bảng được lập chỉ mục (được sử dụng tạm thời) là tốt nhất nhận được xuống đến 10 giây tổng thể. – Todd

48

Tôi đã có yêu cầu tương tự. Không thể thêm chỉ mục vào CTE. Tuy nhiên, trong CTE, hãy chọn thêm mệnh đề ORDER BY trên các trường đã tham gia đã giảm thời gian thực hiện từ 20 phút trở lên xuống dưới 10 giây.

(Bạn cũng cần phải thêm các lựa chọn TOP 100 PERCENT để cho phép một ORDER BY trong một CTE chọn.)

[chỉnh sửa để thêm quote diễn giải từ một bình luận dưới đây]:
Nếu bạn có DISTINCT trong CTE thì TOP 100 PERCENT không hoạt động. Phương pháp gian lận này luôn có sẵn: không cần TOP ở tất cả trong lựa chọn, thay đổi câu lệnh ORDER BY để đọc:
ĐẶT HÀNG CỦA [Blah] OFFSET 0 ROWS

+2

Bạn sẽ học voodoo ở đâu? Nó có tác dụng đáng kể đối với một truy vấn dài hạn mà chúng tôi có. Top 100000 hoạt động tốt hơn 100 PERCENT hàng đầu. Tôi sẽ bắt đầu đào sâu vào máy phân tích truy vấn để xem điều gì đang xảy ra. Cảm ơn! – BlackjacketMack

+0

Điều đó rất thú vị và tốt để biết. Tôi đã thay đổi truy vấn của mình từ 1000000 đầu đến 100 PERCENT hàng đầu. Tôi sẽ đổi lại. Tôi đi qua bài trên MSDN với gợi ý này khi cố gắng để chỉ số một CTE cho perforance. –

+0

TOP 100 PERCENT có thể sử dụng số lượng bản ghi ước tính để trả lại. TOP 1000000 có thể nghĩ rằng sẽ có nhiều hơn và dự trữ nhiều bộ nhớ hơn cho việc thực hiện để không có cảnh báo sắp xếp và tràn đến TempDB. – milivojeviCH

0

@BH - Để giải quyết vấn đề DISTINCT bằng cách sử dụng TOP 100% hoặc TOP 1000000, bạn luôn có thể sử dụng GROUP BY. Phục vụ cùng mục đích và đôi khi nhanh hơn DISTINCT.