2012-01-09 14 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"できないため、「マルチステートメントTVL」はしばしば重大なオーバーヘッドを招きます。

5

これは、SQLクエリオプティマイザがこれらのクエリを同じクエリに変換することを意味しますか。 ?

はい。インラインテーブル値関数は、オプティマイザによって外部クエリに展開されます。マクロのようなもの。

関連する問題