2016-05-10 5 views
0

私は(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ミリ秒かかります。 Query Plan

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

しかし、それはすべて同じです。コメント欄で

+5

クエリヒントとしてOPTION(RECOMPILE)を追加してみてください。パラメータスニッフィングが行われているようです。 https://www.brentozar.com/archive/2013/06/the-elephant-and-the-mouse-or-parameter-sniffing-in-sql-server/ –

+0

これは通常のクエリです(Linq To SQL、 EFによって生成される)。パラメータスニッフィングが起こっている場合、それは他の多くのクエリに起こるはずです。なぜ特定のパラメータを持つ特定のクエリに対してだけですか? – mshsayem

+0

EFに関することはよく知っていませんが、あなたの実行計画にはIX____OwnerId_Categoryを変更して、選択した列を含めてそのキーのルックアップを取り除くことができます。 – sapi

答えて

関連する問題