Sql server EF 6中查询视图的时间不合理

Sql server EF 6中查询视图的时间不合理,sql-server,entity-framework,entity-framework-6,Sql Server,Entity Framework,Entity Framework 6,在已清除缓存的ManagementStudio中,这大约需要6秒钟 SELECT [TransactionSum].[AccountID] AS [AccountID], [TransactionSum].[Balance] AS [Balance], [TransactionSum].[ReservedAmount] AS [ReservedAmount] FROM [dbo].[Transac

在已清除缓存的ManagementStudio中,这大约需要6秒钟

          SELECT
          [TransactionSum].[AccountID] AS [AccountID],
          [TransactionSum].[Balance] AS [Balance],
          [TransactionSum].[ReservedAmount] AS [ReservedAmount]
          FROM [dbo].[TransactionSum] AS [TransactionSum]
          WHERE [AccountID] = 34626
该视图非常复杂,有5个嵌套子查询。事实上,在没有where子句的情况下运行大约需要6秒钟,返回11000行

那么这怎么可能呢

DB.TransactionSum.SingleOrDefault(x => x.AccountID == 34626);
还是这个

var args = new DbParameter[] { new SqlParameter 
      { ParameterName = "accountid", Value = 34626 } };

DB.ExecuteStoreQuery<TransactionSum>("SELECT " +
     "AccountID," +
     "Balance," +
     "ReservedAmount " +
     "FROM TransactionSum " +
     "WHERE AccountID = @accountid", args).SingleOrDefault();
花了1分钟20


因此,根据我对参数嗅探的最新理解,优化器使用34626创建最佳查询计划,然后使用34626实际运行它,这。。。不,我还是不明白。

搜索参数嗅探。假设SQL Server中变量的初始化与脚本同时发生,但事实并非如此。另外,尽量不要直接调用进程中的字符串。现在我很高兴解决AccountID=34626的问题。这应该不到10秒,即完成未缓存的完整查询所需的时间,再加上大量的网络开销。我将尝试创建一个调用视图的存储过程。然后从EF调用该存储过程。然后,该存储过程可以使用一种反参数嗅探方法。很高兴我们都能提供帮助。请记住,重要的是SQL Server如何看待查询,而不是如何编写查询。希望这能帮助您在开发代码时提出更多“我怎么知道我知道什么?”的问题,而不仅仅是SQL Server。例如,与C++不同,SQLServer没有常数@变量。因此,您需要通过调用proc的封装来确保这一点。另一方面,如果没有SQL处理器,脚本就可以正常地编写脚本,而脚本则是无法正常运行的,而在一个进程中它是不能的。把它想象成简单的初始化一个变量,而不为C++(和其他OOP)设置它的值:从运行时间到运行时间,这个值不是恒定的。类似地,SQL Server也无法以大致相同的方式猜测变量,因此它不能使用任何索引,必须疯狂地猜测。奇怪,不是吗?语言很有趣,每次都能教你新的东西。干杯,搜索参数嗅探。假设SQL Server中变量的初始化与脚本同时发生,但事实并非如此。另外,尽量不要直接调用进程中的字符串。现在我很高兴解决AccountID=34626的问题。这应该不到10秒,即完成未缓存的完整查询所需的时间,再加上大量的网络开销。我将尝试创建一个调用视图的存储过程。然后从EF调用该存储过程。然后,该存储过程可以使用一种反参数嗅探方法。很高兴我们都能提供帮助。请记住,重要的是SQL Server如何看待查询,而不是如何编写查询。希望这能帮助您在开发代码时提出更多“我怎么知道我知道什么?”的问题,而不仅仅是SQL Server。例如,与C++不同,SQLServer没有常数@变量。因此,您需要通过调用proc的封装来确保这一点。另一方面,如果没有SQL处理器,脚本就可以正常地编写脚本,而脚本则是无法正常运行的,而在一个进程中它是不能的。把它想象成简单的初始化一个变量,而不为C++(和其他OOP)设置它的值:从运行时间到运行时间,这个值不是恒定的。类似地,SQL Server也无法以大致相同的方式猜测变量,因此它不能使用任何索引,必须疯狂地猜测。奇怪,不是吗?语言很有趣,每次都能教你新的东西。干杯
BoinkDB.ExecuteStoreQuery<TransactionSum>("exec spTransactionSum "+ accountID);
declare @accountid int
set @accountid =34626

SELECT
[TransactionSum].[AccountID] AS [AccountID],
[TransactionSum].[Balance] AS [Balance],
[TransactionSum].[ReservedAmount] AS [ReservedAmount]
FROM [dbo].[TransactionSum] AS [TransactionSum]
WHERE [AccountID] = @accountid