私は(MSSQL 2008R2用のEntity Frameworkの4によって生成された)このクエリを持っている:なぜ私のクエリはmgmt studioで速く実行されますが、アプリケーションでは特定のパラメータが遅いのですか?
SELECT
[Limit1].[C1] AS [C1],
[Limit1].[Id] AS [Id],
[Limit1].[Text] AS [Text],
[Limit1].[Sender] AS [Sender],
[Limit1].[Time] AS [Time],
[Limit1].[Status] AS [Status]
FROM (SELECT TOP (100)
[Extent1].[Id] AS [Id],
[Extent1].[Sender] AS [Sender],
[Extent1].[Time] AS [Time],
[Extent1].[Text] AS [Text],
[Extent1].[Status] AS [Status],
1 AS [C1]
FROM [dbo].[MyTable] AS [Extent1]
WHERE (0 = [Extent1].[DeleteStatus])
AND ([Extent1].[OwnerId] = @p__linq__0)
AND (1 = [Extent1].[Cateogry])
AND ([Extent1].[Id] > @p__linq__1)
) AS [Limit1]
-- @p__linq__0=123, @p__linq__1 = 1234
このいくつかの特定のパラメータを持つクエリを除くすべてのクエリのために未満50ミリ秒で(EFを経由して、アプリケーションから)実行されます。これらのパラメータでは、結果セットでゼロ行が返されますが、クエリは20秒以上(毎回)実行されます。管理スタジオで同じクエリを実行すると、0ミリ秒かかります。
SQL-Serverのプロファイラは、このクエリは、それに対応する例を示します:
exec sp_executesql N'SELECT
[Limit1].[C1] AS [C1],
[Limit1].[Id] AS [Id],
[Limit1].[Text] AS [Text],
[Limit1].[Sender] AS [Sender],
[Limit1].[Time] AS [Time],
[Limit1].[Status] AS [Status]
FROM (SELECT TOP (100)
[Extent1].[Id] AS [Id],
[Extent1].[Sender] AS [Sender],
[Extent1].[Time] AS [Time],
[Extent1].[Text] AS [Text],
[Extent1].[Status] AS [Status],
1 AS [C1]
FROM [dbo].[MyTable] AS [Extent1]
WHERE (0 = [Extent1].[DeleteStatus]) AND ([Extent1].[OwnerId] = @p__linq__0) AND (1 = [Extent1].[Cateogry]) AND ([Extent1].[Id] > @p__linq__1)
) AS [Limit1]',N'@p__linq__0 bigint,@p__linq__1 bigint',@p__linq__0=123,@p__linq__1=1234
問題の表は、これらの懸念の指標があります。
PK___1(Id) -- Clustered, Column [Id] is bigint
IX____OwnerId_Category(OwnerId,Category,Status) -- Included-Column: DeleteStatus
計画(両方とも推定され、正確な)は、このように表示さ
この理由は何ですか?どうすれば修正できますか? ところで:
- テーブルには50M +行が含まれています。
- 統計情報は日々更新されています。
- フラグメンテーションが20%を超えると、3/4日でインデックスが再構築されます。他の記事からの読み込み
、私はこれらを実行する(もちろん、理解せずに、私はちょうど簡単な修正を探していた。。):
DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE
しかし、それはすべて同じです。コメント欄で
クエリヒントとしてOPTION(RECOMPILE)を追加してみてください。パラメータスニッフィングが行われているようです。 https://www.brentozar.com/archive/2013/06/the-elephant-and-the-mouse-or-parameter-sniffing-in-sql-server/ –
これは通常のクエリです(Linq To SQL、 EFによって生成される)。パラメータスニッフィングが起こっている場合、それは他の多くのクエリに起こるはずです。なぜ特定のパラメータを持つ特定のクエリに対してだけですか? – mshsayem
EFに関することはよく知っていませんが、あなたの実行計画にはIX____OwnerId_Categoryを変更して、選択した列を含めてそのキーのルックアップを取り除くことができます。 – sapi