sql-server - Linq 性能 : Two queries, 第一个立即响应,第二个非常慢

标签 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的 View ,它有两个索引

  1. 索引 1(id_tank,日期升序)
  2. 索引 2(id_tank,日期 desc)

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

注3: View 有数百万个寄存器,不同日期和 jar 的结果是相同的。

最佳答案

一周后解决了,查看执行计划(感谢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 });

关于sql-server - Linq 性能 : Two queries, 第一个立即响应,第二个非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9640431/

相关文章:

c# - ExecuteScalar 为 SQL count(*) 返回 false

c# - ReferentialConstraint 中的依赖属性映射到存储生成的列

linq-to-sql - 如何在 LINQ-To-SQL (IDENTITY INSERT) 中手动设置标识字段

Java - 一段时间后停止executequery()

c# - 保存在变量中并乘以双值查询结果 C#/MySql

sql - 在 SQL Server 中的两列之间交换数据是如何工作的?

sql - 如何为此创建 View ?

java - 在servlet中使用executeQuery执行SQL语句

sql-server - MSSQL 数据库中浮点字段中的 NaN 值

sql - Linq To Sql 或 SQL 中的困难查询