3

我正在使用 SQL Server 2008 R2 来解决这个问题。

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

USE Db1
SELECT * FROM Db2.dbo.Table1

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

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

USE Db2
SELECT * FROM Table1

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

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

有没有人遇到过这种行为?您对我可能做错的事情有任何想法吗?

4

2 回答 2

3

终于想通了这个。SELECT 中引用的数据库的 Auto Close 属性设置为 True。我将其设置为 False 并且 SELECT 调用期间的延迟消失了。

所以发生的事情是它总是为每个 SELECT 语句启动数据库!我检查了事件查看器,确实如此,每次调用都有一个数据库启动日志。

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

有关自动关闭属性的更多信息,请参阅下面的链接。默认设置为 True。将此设置为 False,您应该不会遇到此问题。

自动关闭

于 2013-08-03T13:21:43.080 回答
0

这里没有什么神秘之处,完全限定的名称根本没有任何作用。

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

每次重新启动 SQL Server 时,都会先清空内存缓冲区和执行计划缓存,因此执行的第一个查询会明显变慢。

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

于 2013-07-09T13:49:55.003 回答