2010-07-26 34 views
6

tôi đã có một số SQL trông gần như thế này:đặc điểm hiệu suất của T-SQL CTEs

with InterestingObjects(ObjectID, OtherInformation, Whatever) as (
    select X.ObjectID, Y.OtherInformation, Z.Whatever 
    from X join Y join Z -- abbreviated for brevity 
) 

-- ...long query follows, which uses InterestingObjects in several more CTEs, 
-- and then uses those CTEs in a select statement at the end. 

Khi tôi chạy nó, tôi có thể nhìn thấy trong kế hoạch thực hiện nó xuất hiện để được chạy truy vấn trong CTE về cơ bản mỗi lần CTE được tham chiếu. Nếu tôi thay vì tạo một bảng tạm thời #InterestingObjects và sử dụng nó, tất nhiên, nó chạy truy vấn một lần, đặt kết quả trong bảng tạm thời và các truy vấn từ đó trở đi. Trong trường hợp cụ thể của tôi, điều đó làm cho toàn bộ điều chạy nhanh hơn nhiều.

Câu hỏi của tôi là: Đây có phải là những gì tôi có thể mong đợi từ CTE (không ghi nhớ kết quả theo bất kỳ cách nào, cũng giống như nếu nó được gạch chân truy vấn ở khắp mọi nơi?) Có lý do gì khiến SQL Server không thể tối ưu hóa tốt hơn? Thông thường tôi rất ngạc nhiên về cách trình tối ưu hóa thông minh, nhưng tôi ngạc nhiên rằng nó không thể hình dung ra điều này.

(chỉnh sửa: BTW, tôi đang chạy trên SQL Server '08 R2.)

+0

Người dùng Stackoverflow Quassnoi http://stackoverflow.com/users/55159/quassnoi đã viết một bài viết thú vị về điều này. http://explainextended.com/2009/05/28/generating-xml-in-subqueries/ –

+0

Điều đó thật thú vị. Tôi không hoạt động dưới bất kỳ ràng buộc nào như ông mô tả (ví dụ: thông qua một ORM không cho phép các bảng tạm thời) vì vậy tôi không thực sự thấy lý do tại sao phương pháp của ông đẹp hơn các bảng tạm thời - và rõ ràng nếu bạn hardcode một kế hoạch như vậy, đó là một chi phí bảo trì lớn khi bạn thay đổi truy vấn. Tuy nhiên, một cái nhìn thực sự hữu ích về cách kế hoạch thực hiện kiểm soát hành vi này. – alphabasic

Trả lời

4

CTE có thể được tốt hơn hoặc tồi tệ hơn, chỉ tùy thuộc vào cách mà họ đang sử dụng (liên quan đến khái niệm đệ quy, lập chỉ mục, vv .). Bạn có thể thấy bài viết này thú vị: http://www.sqlservercentral.com/articles/T-SQL/2926/