2012-01-09 4 views
3

Я использую SQL Server 2008R2.SQL Server 2008R2 Пользовательская функция (таблица) Производительность

У меня есть следующие настройки:

-- Query #1 
SELECT * FROM 
Product P 
INNER JOIN ProductComments C ON C.ProductId = P.ProductId 

-- Query #2 
SELECT * FROM 
GetAllProducts() P 
CROSS APPLY GetCommentsOfProduct(P.ProductId) C 

где GetAllProducts() является

CREATE FUNCTION GetAllProducts 
(  
) 
RETURNS TABLE 
AS 
RETURN 
(
    SELECT * FROM Product 
) 

GetCommentsOfProduct(P.ProductId) и является

CREATE FUNCTION [dbo].[GetCommentsOfProduct] 
( 
    @ProductId int 
) 
RETURNS TABLE 
AS 
RETURN 
(
    SELECT * FROM ProductComments WHERE ProductId = @ProductId 
) 

Оба запроса # 1 и # 2 запроса результат в точно такой же фактический план выполнения и вернуть тот же результат. Стоимость их запросов составляет 50% относительно партии. Означает ли это, что оптимизатор запросов SQL переводит эти запросы в один и тот же запрос? И почему нет накладных расходов для вызова UDF? И означает ли это, что я могу структурировать все мои таблицы в UDF и не будет иметь проблем с производительностью даже при выполнении операций JOIN? Знаете ли вы о каких-либо недостатках?

+1

Расчетный или фактический план выполнения? Вы должны использовать 'VIEW' для этой цели, а не ... – Yuck

+0

«Знаете ли вы какие-то недостатки» - неважно, какие у вас сильные стороны? – AakashM

+0

@Yuck: фактический план выполнения – Chris

ответ

7

multiple ways написать табличную функцию. Синтаксис, который вы используете, с AS RETURN, является «встроенной табличной функцией». Это эквивалентно представлению. SQL Server расширит эту функцию при выполнении инструкции. Для вызова этой функции нет накладных расходов.

«Многозначная табличная функция» не эквивалентна представлению. Оптимизатор не может "inline" несколько операторов, поэтому «многорежимный ТВЛ» часто несет значительные накладные расходы.

5

Означает ли это, что оптимизатор SQL-запросов переводит эти запросы в тот же запрос?

Да. Встроенные табличные функции расширяются во внешний запрос оптимизатором. Вид вроде макроса.

Смежные вопросы