我需要一些帮助来解释SQL Server 2008中的这种行为。我有一个简单的C++程序在循环中运行查询。这是程序的伪代码。SQL Server查询随着时间的推移从0降低到60毫秒
myTempid = 0;
while (1) {
execQuery(select a.id
from a,b,c,d
where a.id = b.id
and b.id = c.id
and c.id = d.id
and id.id = myTempID)
}
这里有一些事实
- A,B,C都是空表
- d具有约5500行
查询开始时采取 '0msec'(我可以从分析器中看到这一点);但是在X次迭代之后;它跳到约60毫秒并停留在那里。 X是变体;有时是100 ..有时是200.奇怪的是,一旦它从0跳到60毫秒,无论myID如何,它都会停留在那里。
对我来说,听起来像SQL Server是以某种方式'去缓存'的查询计划?这对任何人都有意义吗
谢谢!
什么是id.id? 你确定在execQuery例程中没有内存或连接泄漏吗? – Jacob 2010-08-01 02:50:51
您是在SQL服务器上还是在您的应用中计时执行?如果在你的应用程序中,这可能会打开连接或打开一个最大值。 – Bill 2010-08-01 03:50:30
可能是参数嗅探:http://www.sqlpointers.com/2006/11/parameter-sniffing-stored-procedures.html – 2010-08-01 03:59:33