2009-07-03 165 views
1

这不是关于优化SQL命令的问题。我想知道确保SQL连接保持打开并准备好尽可能高效地处理命令的方式。优化SQL连接性能?

我现在看到的是我可以执行一个SQL命令,该命令需要约1秒,额外的执行将花费约300毫秒。这是之前对SQL服务器执行的命令(来自另一个应用程序实例)......因此,在此应用程序初始执行之前,SQL缓存应完全填充以执行查询。只要我不断重新执行查询,我会看到大约300ms的时间,但是如果我将应用程序闲置5-10分钟并返回,则下一个请求将回到〜1s(与初始请求相同)。

有没有办法通过连接字符串或SqlConnection上的某些属性指示框架保持连接水合并准备好有效地处理查询?

回答

0

由于不关闭它而使其保持打开状态。 :)但这不是通知,因为连接池将为您处理连接管理。你有它启用?

+0

默认启用。 – 2009-07-07 00:36:37

2

您是否检查过程的执行计划?我认为执行计划会被加载到服务器的内存中,然后在某段时间之后清除或取决于过程中访问的表等。我们曾经有过简化存储过程(可能会将它们分开)的情况,从而减少了数据库服务器在计算计划时所需执行的工作量......并最终减少了第一次调用过程的时间......您可以发出命令强制存储过程每次重新编译以测试您是否正在缩短初始调用时间... 我们遇到过存储过程的复杂性使得数据库服务器不断需要根据不同的参数进行重新编译的情况,这些参数大大降低了速度,将SP分解或将大型选择语句简化为多个更新语句等都有相当大的帮助。

其他想法也许间歇性地每隔一段时间间歇地调用一个简单的getDate()或类似的东西,这样SQL服务器就会唤醒(希望有意义)......就像在IIS中将内存保存在内存中一样。

0

如果您使用多个数据库连接,它可能会更有效。拥有一个数据库连接意味着最佳的访问速度始终受到顺序限制。而> 1的连接意味着你的编译器有机会优化并发访问。我想你正在使用.NET?

此外,如果你多次发出相同的SQL语句,它可以将数据库服务器缓存结果的时间很短,因此使结果集快速返还..

1

打开连接的默认值在.NET连接池中为零。

您可以在连接字符串中该值调整为1个或多个:

"data source=dbserver;...Asynchronous Processing=true;Min Pool Size=1" 

查看更多有关这些options in MSDN