我有两个非常相似的查询,第一个使用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的视图,它有两个索引
注2:如果我先执行第二个查询,结果是相同的:Query1慢,查询2快。
注3:视图有数百万个寄存器,不同日期和坦克的结果相同。
答案 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端。