3

我有两个非常相似的查询,第一个使用 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,日期升序)
  2. 索引 2(id_tank, date desc)

注意 2:如果我首先执行第二个查询,结果是相同的:Query1 慢,Query 2 快。

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

4

4 回答 4

3

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

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

NOEXPAND 解释可以在以下位置找到:表格提示

所以,最终的查询是:

查询 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 });
于 2012-03-14T17:38:53.423 回答
1

如果没有查询计划等的比较,这很难回答......

但是从您的描述看来,在 SSMS 中运行时,这两个查询都很快,而在 .NET 中运行时,其中一个查询很慢 - 这种不同行为的原因可能在于用于 DB 会话的设置,SSMS 的默认值不同从 ADO.NET 中使用的默认值(这是 LINQ 使用的)。可以在此处找到非常详细的解释,包括有关如何解决这方面某些情况的一些提示。

请发布更多详细信息,尤其是。查询计划以获得更具体的帮助...

于 2012-03-13T08:29:59.787 回答
0

尝试添加option(recompile)到查询的末尾。

更新

您的索引 1 和索引 2 几乎相同,您可以删除其中任何一个。也可以通过with(index(ix_index1))table 上的选项提示引擎使用哪个索引,如下所示:

SELECT TOP 1 * 
FROM ViewDataTanksDataDevicesSB with(index(ix_index1))
WHERE id_tank = 123 AND date <= '20120313'
order by date desc
于 2012-03-13T08:42:54.150 回答
0

您能否提供来自 MS SQL Server Profiler 的更多信息?查询计划是首选以确定它是在 MS SQL Server 端还是在 CLR 端。

于 2012-03-18T21:43:51.853 回答