データベースファーストのアプローチであるEntity Framework 5.0.0を使用しています。
IQueryable を返すいくつかのインライン テーブル値関数 (ITVF) を EDMX にインポートしました。返されたら、ほとんどの場合、.Skip().Take() のような操作を行います。
少なくとも数時間は、パフォーマンスは良好です。何もしなければ (少なくとも私が知っていることでは)、パフォーマンスは一晩で低下します。
最初は、クエリの実行に約 500 ミリ秒かかります。夜になると、クエリがタイムアウト例外 (30 ~ 60 秒) を返すレベルまでパフォーマンスが低下します。これは、テーブル関数が次のようなコードから実行された場合にのみ発生します。
IQueryable<MyResult> results =
_context.MyTableFunction("searchforthis")
.Skip(currentPagingPosition*20).Take(20);
(これが発生するのは、クエリを初めて実行したときだけではありません)
ただし、同じテーブル関数を SQL Server Management Studio から直接実行すると、クエリは約 500 ミリ秒で実行されます。
テーブル関数を「再保存」すると、次のようになります。
ALTER FUNCTION [dbo].[MyTableFunction]......
「実際の」変更を行わなくても、コードから呼び出された場合でも、すぐに 500 ミリ秒の速度に戻ります。
明らかな何か、何かアイデアがありませんか?