在Management Studio中,清除缓存大约需要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();
需要3分钟? CPU始终处于最大值。我可以使用sys.dm_exec_sql_text看到渲染的sql。我跑了6秒钟。
修改
@clifton_h建议有效。将视图包装在sproc中后
BoinkDB.ExecuteStoreQuery<TransactionSum>("exec spTransactionSum "+ accountID);
非常快。
(许多传递参数的变体都是你应该的方式,失败。我现在不确定任何事情,但我相信这不是重点。)
我不知道发生了什么。 EF f * k怎么办?
DB.TransactionSum.SingleOrDefault(x => x.AccountID == 34626);
如此糟糕,以至于增加多个订单的查询时间?是否告诉服务器每次调用它时通过对整个整数空间进行采样来优化其查询计划?
每次运行查询时,Management Studio执行或执行哪种隐式优化都会隐式创建一个sproc?而且,为什么这会有所帮助呢?
那些看起来甚至像愚蠢的问题,但我现在只是完全被迷惑了。我一直在阅读的关于参数嗅探的内容都是关于优化,调整,几秒钟的剃须。我们正在谈论数量级。
实际上,如果有人能告诉我如何从Management Studio中查询超过3分钟,那将会有所帮助!
修改2
是的,这很有帮助。此
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
花了1分20秒。
所以,根据我对参数嗅探的新理解,优化器使用34626来创建一个最佳的查询计划,但是然后使用34626实际运行它......不,我仍然没有得到它。