Sql 存储过程未使用索引

Sql 存储过程未使用索引,sql,sql-server,tsql,stored-procedures,indexing,Sql,Sql Server,Tsql,Stored Procedures,Indexing,此存储过程是linq查询执行的结果:我从SQLServer探查器获得它 exec sp_executesql N'SELECT [Limit1].[C2] AS [C1], [Limit1].[object] AS [object], [Limit1].[C1] AS [C2] FROM ( SELECT TOP (50) [GroupBy1].[A1] AS [C1], [GroupBy1].[K1] AS [object], 1 AS [C2] F

此存储过程是linq查询执行的结果:我从SQLServer探查器获得它

exec sp_executesql N'SELECT 
[Limit1].[C2] AS [C1], 
[Limit1].[object] AS [object], 
[Limit1].[C1] AS [C2]
FROM ( SELECT TOP (50) 
    [GroupBy1].[A1] AS [C1], 
    [GroupBy1].[K1] AS [object], 
    1 AS [C2]
    FROM ( SELECT 
        [Extent1].[object] AS [K1], 
        COUNT(1) AS [A1]
        FROM [dbo].[BEM_EVT_FULL] AS [Extent1]
        WHERE [Extent1].[date] > @p__linq__0
        GROUP BY [Extent1].[object]
    )  AS [GroupBy1]
)  AS [Limit1]',N'@p__linq__0 datetime2(7)',@p__linq__0='2015-01-21 00:00:00'
我已经在所有列(对象和日期)上创建了索引。问题是,此查询完全忽略索引,运行时间超过3分钟

另一方面,我有一个手动运行的查询

SELECT 
[Limit1].[C2] AS [C1], 
[Limit1].[object] AS [object], 
[Limit1].[C1] AS [C2]
FROM ( SELECT TOP (50) 
    [GroupBy1].[A1] AS [C1], 
    [GroupBy1].[K1] AS [object], 
    1 AS [C2]
    FROM ( SELECT 
        [Extent1].[object] AS [K1], 
        COUNT(1) AS [A1]
        FROM [dbo].[BEM_EVT_FULL] AS [Extent1]
        WHERE [Extent1].[date] > convert(datetime2, '2015-01-21 00:00:00.0000000', 121)
        GROUP BY [Extent1].[object]
    )  AS [GroupBy1]
)  AS [Limit1]
此查询得益于索引,并在1s下运行。有人知道这是为什么吗?

我觉得添加选项(重新编译)会对您有所帮助。问题是如何使用实体框架来实现这一点。查看此链接


你看过这个计划了吗?时间是从SQL事件探查器还是从.NET代码?参数嗅探?检查计划,看看它编译时使用了什么值(左边第一件事的属性),你怎么知道它忽略了索引?如果只是执行时间,我同意@JamesZ的观点,这很可能是参数嗅探。顺便说一句,@SteveDrake我通过查看sql server配置文件证明了这一点OP不控制查询的文本;它是由讨厌的实体框架生成的。谢谢你的提示。我用一个链接编辑了我的答案,链接到一个成功的人。啊,太难看了。我想知道,为了使EF正常运行,您必须执行的所有丑陋的变通方法和黑客是否值得任何所谓的优势…我认为我有参数嗅探问题,日期时间在哪里传递statement@Stephan你确定我们把选项(重新编译)放在那个语句上吗?
exec sp_executesql 
    N'SELECT    [Limit1].[C2] AS [C1], 
                [Limit1].[object] AS [object], 
                [Limit1].[C1] AS [C2]
    FROM 
    (
        SELECT TOP (50) [GroupBy1].[A1] AS [C1], 
                        [GroupBy1].[K1] AS [object], 
                        1 AS [C2]
        FROM 
        (
            SELECT 
            [Extent1].[object] AS [K1], 
            COUNT(1) AS [A1]
            FROM [dbo].[BEM_EVT_FULL] AS [Extent1]
            WHERE [Extent1].[date] > @p__linq__0
            GROUP BY [Extent1].[object]
        )  AS [GroupBy1]
    )  AS [Limit1]
    OPTION (RECOMPILE)',

    N'@p__linq__0 datetime2(7)',
    @p__linq__0='2015-01-21 00:00:00'