在SELECT中使用完全限定名称时性能下降

时间:2013-07-09 13:42:34

标签: sql-server sql-server-2008-r2

我正在使用SQL Server 2008 R2解决此问题。

在我的一个应用程序中,我需要引用另一个数据库中的表。所以我做了一个查询:

USE Db1
SELECT * FROM Db2.dbo.Table1

即使对于只有300条记录的表,查询也需要大约2秒钟才能完成。延迟是一致的,我在Management Studio中运行它并点击Execute,结果是一样的。我做了大约10次,结果一致。

现在我运行查询但这次在实际数据库的上下文中运行它:

USE Db2
SELECT * FROM Table1

返回相同的结果几乎没有等待时间。

现在奇怪的部分是,当我回到第一个查询时,延迟不再发生!每次重新启动SQL Server时都会重现此行为。

之前有没有人遇到过这种行为?你对我可能做错了什么有任何想法吗?

2 个答案:

答案 0 :(得分:3)

最后想出了这个。 SELECT中引用的数据库的Auto Close属性设置为True。我将其设置为False,SELECT调用期间的延迟消失。

所以发生的事情是它总是为每个SELECT语句启动数据库!我查看了事件查看器并且足够真实,每次调用都会启动数据库启动日志。

要将此设置为false,我使用Management Studio,右键单击Database,然后转到Properties。在“属性”窗口中,选择“选项”,然后在“自动”组下,第一个项目为“自动关闭”。将此设置为False。

有关“自动关闭”属性的详细信息,请参阅以下链接。默认设置为True。将此设置为False,您不应该遇到此问题。

Auto_Close

答案 1 :(得分:0)

这里没有任何谜团,完全限定的名称根本不起作用。

第一次请求时,表数据会缓存在内存中。任何后续调用都将从内存中读取数据,而不是从磁盘读取数据。此外,SQL Server缓存已编译的执行计划并将其重用于新查询。

每次重新启动SQL Server时,都会先清空内存缓冲区和执行计划缓存,这样您执行的第一个查询就会慢得多。

为了获得有意义的结果,您需要使用以下命令清除缓冲区和执行计划缓存: