Tôi gặp sự cố với CROSS APPLY
với chức năng có giá trị bảng được định giá trị. đây được đơn giản hóa ví dụ mã giả:CROSS ÁP DỤNG với hiệu suất hạn chế chức năng bảng có giá trị
SELECT *
FROM (
SELECT lor.*
FROM LOT_OF_ROWS_TABLE lor
WHERE ...
) AS lor
CROSS APPLY dbo.HeavyTableValuedFunction(lor.ID) AS htvf
INNER JOIN ANOTHER_TABLE AS at ON lor.ID = at.ID
WHERE ...
- Nội chọn trên bàn
LOT_OF_ROWS_TABLE
đang trở lại nhiều hàng. - Tham gia các bảng
LOT_OF_ROWS_TABLE
vàANOTHER_TABLE
chỉ trả lại một hoặc một vài hàng. - Chức năng bảng có giá trị rất tốn thời gian và khi gọi cho nhiều hàng thì lựa chọn này kéo dài rất lâu.
Vấn đề của tôi:
Các hàm được gọi cho tất cả các hàng trở về từ LOT_OF_ROWS_TABLE
không phụ thuộc vào thực tế là các dữ liệu sẽ bị hạn chế khi chỉ cần tham gia ANOTHER_TABLE
.
Lựa chọn phải ở định dạng được hiển thị - nó được tạo ra và trên thực tế nó là nhiều hơn dificult.
Khi tôi cố gắng viết lại nó, nó có thể rất nhanh, nhưng nó không thể được viết lại như thế này:
SELECT *
FROM (
SELECT lor.*
FROM LOT_OF_ROWS_TABLE lor
WHERE ...
) AS lor
INNER JOIN ANOTHER_TABLE AS at ON lor.ID = at.ID
CROSS APPLY dbo.HeavyTableValuedFunction(at.ID) AS htvf
WHERE ...
Tôi muốn biết:
Có bất kỳ thiết lập hoặc gợi ý hoặc cái gì đó buộc chọn để gọi chức năng chỉ cho các hàng cuối cùng bị hạn chế?
Cảm ơn bạn.
EDIT:
Bảng giá chức năng là rất phức tạp: http://pastebin.com/w6azRvxR. Lựa chọn mà chúng ta đang nói đến là "cấu hình người dùng" và được tạo: http://pastebin.com/bFbanY2n.
Nói rõ ràng có thể: Nếu chỉ bạn mới có thể thay đổi thứ tự của các kết nối trong văn bản truy vấn. Sau đó, bạn có thể đã sử dụng gợi ý truy vấn FORCE_ORDER. Mã được tạo ra như thế nào? Không có cách nào bạn có thể thay đổi hành vi vào cuối đó? –
Thay đổi hàm băm của bảng 'dbo.HeavyTableValuedFunction (..)' thành hàm Bảng-Giá trị nội tuyến. – RBarryYoung
@RBarryYoung: quá phức tạp để chỉ viết lại một hàm nội tuyến –