Linq性能:两个查询,第一个响应立即,第二个非常慢

时间:2012-03-09 20:18:54

标签: sql-server linq-to-sql executequery

我有两个非常相似的查询,第一个使用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. 索引1(id_tank,date asc)
  2. 索引2(id_tank,date desc)
  3. 注2:如果我先执行第二个查询,结果是相同的:Query1慢,查询2快。

    注3:视图有数百万个寄存器,不同日期和坦克的结果相同。

2 个答案:

答案 0 :(得分:3)

我在一周后解决了它,查看了执行计划(感谢Yahia的建议)!!!

在两个查询中,我指定了 INDEX (感谢Denis),我必须指定提示 NOEXPAND

NOEXPAND说明可在以下网址找到:Table hints

所以,最终的查询是:

查询1

IEnumerable<ViewDataTanksDataDevice> res= 
this.ExecuteQuery<ViewDataTanksDataDevice>(
   "SELECT TOP 1 * FROM ViewDataTanksDataDevicesSB with (index(IX_ViewDataTanksDataDevicesSB_TankIdDate) noexpand) 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 with (index(IX_ViewDataTanksDataDevicesSB_TankIdDate) noexpand) WHERE id_tank = {0} AND date <= {1} order by date desc", 
   new object[] { tankId, date });

答案 1 :(得分:0)

您能从MS SQL Server Profiler中提供更多信息吗?查询计划是首选,以确定它是在MS SQL Server端还是在CLR端。