to jest często znacznie bardziej wydajnych, ale wymaga, aby zmienić funkcję skalarną do funkcji wycenione tabeli inline.
UPDATE
a
SET
SomeField = b.SomeField
FROM
TableA AS a
CROSS APPLY
dbo.oneInlineTableValuedFunction(@CurrencyFrom, e.Currency) AS ITVF
INNER JOIN
TableB b
ON b.Link = a.Link
WHERE
b.CostMin <= @Cost * ITVF.exchangeRate
AND b.CostMax >= @Cost * ITVF.exchangeRate
Chociaż funkcje wycenione tabela powrócić tabele, ty może wybrać retun tylko jeden wiersz z jednego pola. Następnie używasz go skutecznie jako funkcji skalarnej - Ale masz wszystkie zalety jak SQL Server może optymalizować zapytania nad ...
- Jeśli TVF jest Inline (a nie multi-rachunek)
- The TVF zostaje rozszerzona na zewnątrz w zapytaniu
- rezultatem jest lepsza niż wydajność dramatiaclly funkcji skalarnych
Przykład inline Tabela Ceniona Funkcja:
CREATE FUNCTION dbo.oneInlineTableValuedFunction (
@currencyFrom VARCHAR(32),
@currencyTo VARCHAR(32)
)
RETURNS TABLE
AS
RETURN (
SELECT
exchangeRate
FROM
dbo.someTable
WHERE
currencyFrom = @currencyFrom
AND currencyTo = @currencyTo
)
Celowo trywialne
Jeden przykładowy post na ten temat: scalar-functions-inlining-and-performance
Jeśli wyszukaæ w internecie INLINE CROSS APPLY SCALAR FUNCTION PERFORMANCE
Jestem pewien, że masz dużo więcej.
Dziękuję. Wydaje się, że nie ma innego wyjścia, jak zrezygnować z funkcji skalarnych na korzyść funkcji o wartościach tabelarycznych. – 10p
@ 10p - Są * znacznie bardziej wydajne, gdy są stosowane w całym zestawie danych. – MatBailie