この種のものは、前の質問から続いています。
Where句に応じたSQL Serverクエリのタイムアウト
where句に応じて、クエリの実行が非常に遅くなります。CTEを使用してそのクエリを書き直し、問題をうまく回避しましたが、答えが見つかりませんでした。
別の同様のクエリが最近微調整されて別のフィールドが追加され、実行して 10,000 行を返すのに約 30 秒かかっていたパフォーマンスが突然低下し、10 時間以上かかるようになりました (最終的には同じ結果セットを返します)。今日、私はこれのトラブルシューティングを開始し、何か奇妙なことを発見しました.
私は常にdatetime値から日付のみを抽出する必要があるため、ロジックを関数に書きました:
CREATE FUNCTION [dbo].[cDate] ( @pInputDate DATETIME )
RETURNS DATETIME
BEGIN
RETURN CAST(CONVERT(VARCHAR(10), @pInputDate, 111) AS DATETIME)
END
GO
この新しい非効率的なクエリで、その関数をクエリのCAST(CONVERT(VARCHAR(10), @pInputDate, 111) AS DATETIME)
インラインに置き換えると、クエリの実行速度が最大 10 時間から 2 秒弱に低下することがわかりました。推定実行計画に違いは見られません。ちなみに、これは追加されたフィールドではありません。他のフィールドを追加すると、何らかの形で実行計画が変更され、上記の条件が増幅されたと思います。
私の質問は、これは正常ですか?上記のように、繰り返しのプロセスには関数を使用します。これは、何かを行うより効率的な方法を見つけた場合に、保守、記憶、および更新が容易になるためです。関数のパフォーマンスを向上させるために何かをする必要がありますか?