嗯,我知道。“SSMS 快,应用程序慢” ——这听起来很熟悉。可以开始考虑参数嗅探或连接设置。但我想我的情况并非如此。
这就是查询:
SELECT [ST].*, [STL].*
FROM [WP_CashCenter_StockTransaction] AS [ST]
LEFT JOIN [WP_CashCenter_StockTransactionLine] AS [STL] ON ([STL] [StockTransaction_id] = [ST].[id])
WHERE
([ST].[Type] IN (0, 1, 10, 9)
AND ([STL].[Direction] IN (0, 1) OR [STL].[id] IS NULL)
AND [ST].[Status] IN (0,1)
AND ( ([STL].[StockContainer_id] = 300000742600 OR [STL].[id] IS NULL) AND [ST].[StockContainerID] = 300000742600))
如果您不介意(请在评论中说明),我将发布执行计划图片的链接,因为其中会有很多。
我从 SSMS 获得的执行计划:http: //i.imgur.com/DjTypV2.png(运行不到一秒)
执行计划,当它从应用程序执行时用于查询:http: //i.imgur.com/Ra45CAo.png (runs ~3sec)
因此,由于某种原因,sql-server 做出了错误的估计,并且在第二种情况下更喜欢表扫描。
查询是动态构建的,并为 StockContainerID 的每个新值(无参数)生成新计划。
好吧,所以放弃了试图找出问题并只是使用FORCESEEK提示:
SELECT [ST].*, [STL].*
FROM [WP_CashCenter_StockTransaction] AS [ST] WITH(FORCESEEK)
LEFT JOIN [WP_CashCenter_StockTransactionLine] AS [STL] WITH(FORCESEEK) ON ([STL].[StockTransaction_id] = [ST].[id])
现在,执行计划似乎是相同的:
http://i.imgur.com/orq7Pmx.png(从应用程序执行)。但它仍然需要〜3秒。
看看这个:
http://i.imgur.com/ZFhyWYc.png(SSMS,1次执行次数,1 行估计)
http://i.imgur.com/bIeTE13.png(应用程序,执行次数为 1,估计行数为 655k)
http://i.imgur.com/FERBNQR.png(SSMS,1次执行次数,1 行估计)
http://i.imgur.com/pm2k8CS.png(应用程序,执行次数 655k,估计 1 行)
您应该已经注意到第二个计划使用并行性。我不知道这是否是问题的原因(我认为不是)。