Mam problem z CROSS APPLY
z parametryzowaną funkcją wycenianą w tabeli. Tutaj jest uproszczony przykład kodu pseudo:CROSS APPLY z tabelą o ograniczonej wydajności funkcji
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 ...
- Wewnętrzna wybrać na stół
LOT_OF_ROWS_TABLE
powraca wiele wierszy. - Łączenie tabel
LOT_OF_ROWS_TABLE
iANOTHER_TABLE
zwraca tylko jeden lub kilka wierszy. - Funkcja wyceniana za pomocą tabeli jest bardzo czasochłonna i podczas wywoływania wielu wierszy wybór trwa bardzo długo.
Mój problem:
Funkcja jest wywoływana dla wszystkich wierszy zwracanych z LOT_OF_ROWS_TABLE
niezależnie od faktu, że dane zostaną ograniczone, gdy tylko przyłączyć ANOTHER_TABLE
.
Wybór musi być w przedstawionym formacie - jest generowany, a w rzeczywistości jest znacznie trudniejszy.
Kiedy próbuję go przepisać, to może być bardzo szybka, ale to nie może być zapisane tak:
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 ...
Chciałbym wiedzieć:
Czy istnieje ustawienie lub podpowiedź czy coś, co zmusza funkcję select do wywołania tylko dla ostatecznie ograniczonych wierszy?
Dziękuję.
Edycja:
Tabela cenione funkcja jest bardzo złożona: http://pastebin.com/w6azRvxR. Wybrany przez nas parametr to "skonfigurowany przez użytkownika" i wygenerowany: http://pastebin.com/bFbanY2n.
Stwierdzenie oczywiste: być może: gdybyś mógł zmienić kolejność złączeń w tekście zapytania. Wtedy mógłbyś użyć wskazówki zapytania FORCE_ORDER. W jaki sposób generowany jest kod? Czy nie można zmienić zachowania w tym celu? –
Zmień wieloliniową funkcję wielowierszową o nazwie "dbo.HeavyTableValuedFunction (..)" na wbudowaną funkcję wartości tabeli. – RBarryYoung
@RBarryYoung: zbyt skomplikowane, aby po prostu przepisać na funkcję inline –