【发布时间】:2012-03-27 06:43:26
【问题描述】:
我有两个查询非常相似,使用 Linq ExecuteQuery 方法第一个需要 30 秒,而第二个查询是中间的。
我也在 Microsoft SQL Server Management Studio 中执行查询,两个查询的响应时间为 0 秒。
查询 1(慢)
IEnumerable<ViewDataTanksDataDevice> res=
this.ExecuteQuery<ViewDataTanksDataDevice>(
"SELECT TOP 1 * FROM ViewDataTanksDataDevicesSB WHERE id_tank = {0} AND date >= {1} order by date",
new object[] { tankId, date });
查询 2(快速)
IEnumerable<ViewDataTanksDataDevice> res=
this.ExecuteQuery<ViewDataTanksDataDevice>(
"SELECT TOP 1 * FROM ViewDataTanksDataDevicesSB WHERE id_tank = {0} AND date <= {1} order by date desc",
new object[] { tankId, date });
注1:ViewDataTanksDataDevicesSB是一个带有SCHEMA BINDING的视图,它有两个索引
- 索引 1(id_tank,日期升序)
- 索引 2(id_tank,日期描述)
注意 2:如果我先执行第二个查询,结果是相同的:查询 1 慢,查询 2 快。
注意 3:视图有数百万个寄存器,不同日期和坦克的结果是相同的。
【问题讨论】:
-
执行计划告诉你什么?
-
如果先运行查询 2,最后运行查询 1,会发生什么情况?
-
您可以考虑在执行代码查询和执行计划时查看 SQL Server 的 Profiler 工具。它闻起来很像索引问题(ASC 与 DESC)
-
对于给定的日期,第一个查询的工作集是否明显更大?此外,它对某些日期输入的响应是否比其他的更快?
-
您是否尝试过更新统计信息?
EXEC sp_updatestats。因为听起来查询计划的生成方式错误
标签: sql-server linq-to-sql executequery