【发布时间】:2015-06-24 14:03:34
【问题描述】:
这个存储过程是 linq 查询执行的结果:我从 Sql Server Profiler 得到它
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]
此查询受益于索引并在 1 秒内运行。有谁知道这是为什么?
【问题讨论】:
-
您是否通过查看计划证明了这一点?是 SQL 分析器还是您的 .NET 代码的时间安排?
-
参数嗅探?检查计划,看看它是用什么值编译的(左边第一件事的属性)
-
你怎么知道它忽略了索引?如果只是执行时间,我同意@JamesZ 这可能是参数嗅探的情况。
-
顺便说一句,this may help。
-
@SteveDrake 我已经通过查看 sql server profiler 证明了这一点
标签: sql sql-server tsql stored-procedures indexing