テーブル値関数のパフォーマンスで奇妙なシナリオがあります。基本的には、DATETIMEをパラメータとするインラインテーブル値関数があります。それは一種の、このようになります日付パラメータをインラインテーブル値関数に渡すことがありません
(ないまさにこのことを):
CREATE FUNCTION fn_MyFunction(@StartDate DATETIME)
RETURNS TABLE
AS
RETURN (
SELECT COUNT(*), CustomerID, SUM(PAID)
FROM Orders
WHERE OrderDate > @StartDate
GROUP BY CustomerID
)
は今、私はこのクエリは> 1分間実行されている問題を調査しようとしています。
SELECT * FROM fn_MyFunction('7/1/2011')
これは> 1分間実行されます。
私はこの方法でクエリを呼び出す場合は、:
DECLARE @startDate DATETIME = '7/1/2011'
SELECT * FROM fn_MyFunction(@startDate)
なお、第2の下で実行されます。 SQL Serverは、両方の呼び出しに対して全く異なる説明計画を使用しています。
明らかに、2番目の方法を常に実行したいと思いますが、残念ながら、LINQ 2 SQLを通じてこのテーブル値関数を呼び出していますが、これは中間変数を宣言しません。
インラインテーブル値関数で中間変数を使用する方法はありますか?私は本当にこれを複数行のテーブル値関数に変換したくありません。他のアイデアも歓迎されるでしょう。私は少し困惑しています。
テストでは、 'SELECT * FROM fn_MyFunction( '7/1/2011')'を複数回実行しようとしましたか? –
@ジョン。はい。数回。キャッシュの問題ではありません。 – Linus
あなたにLINQを教えてください。 –