4

データベースファーストのアプローチである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 ミリ秒の速度に戻ります。

明らかな何か、何かアイデアがありませんか?

4

1 に答える 1