インラインのテーブル値関数を作成してみてください。例:
CREATE FUNCTION dbo.fxnExample (@Parameter1 INTEGER)
RETURNS TABLE
AS
RETURN
(
SELECT Field1, Field2
FROM SomeTable
WHERE Field3 = @Parameter1
)
-- Then call like this, just as if it's a table/view just with a parameter
SELECT * FROM dbo.fxnExample(1)
SELECTの実行プランを表示すると、関数についての言及はまったく表示されず、実際には、クエリされている基になるテーブルが表示されます。これは、クエリの実行プランを生成するときに、基になるテーブルの統計が使用されることを意味するため、適切です。
回避すべきことは、基になるテーブル統計が使用されず、実行プランが不十分なためにパフォーマンスが低下する可能性があるため、マルチステートメントテーブル値関数です。
回避する例 :
CREATE FUNCTION dbo.fxnExample (@Parameter1 INTEGER)
RETURNS @Results TABLE(Field1 VARCHAR(10), Field2 VARCHAR(10))
AS
BEGIN
INSERT @Results
SELECT Field1, Field2
FROM SomeTable
WHERE Field3 = @Parameter1
RETURN
END
微妙に異なりますが、関数をクエリで使用するとパフォーマンスに大きな違いが生じる可能性があります。