今天,我的一个伙伴告诉我,除了启动SQL Server之外,我还可以简单地分离并重新附加数据库,此操作将从缓存中清除给定数据库的页面和计划。我不同意并在下面提供证据。如果您不同意我的意见或有更好的反驳,则绝对不要提供。
我在此版本的SQL Server上使用AdventureWorks2012:
选择@@ VERSION; Microsoft SQL Server 2012-11.0.2100.60(X64) Windows NT 6.1(内部版本7601:Service Pack 1)上的Developer Edition(64位)
加载数据库后,我运行以下查询:
首先,运行在此处找到的乔纳森·K的AW育肥脚本:
---------------------------
-步骤1:Bpool Stuff?
---------------------------
USE [AdventureWorks2012];
走
选择
OBJECT_NAME(p.object_id)AS [ObjectName]
,p.object_id
,p.index_id
,COUNT(*)/ 128 AS [缓冲区大小(MB)]
,COUNT(*)AS [buffer_count]
从
sys.allocation_units AS a
内联接sys.dm_os_buffer_descriptors AS b
开启a.allocation_unit_id = b.allocation_unit_id
内部联接系统分区AS p
开启a.container_id = p.hobt_id
哪里
b.database_id = DB_ID()
AND p.object_id> 100
通过...分组
p.object_id
,p.index_id
订购
buffer_count DESC;
结果显示在这里:

分离并重新附加数据库,然后重新运行查询。
---------------------------
-步骤2:分离/固定
---------------------------
-分离
USE [主人]
走
EXEC master.dbo.sp_detach_db @dbname = N'AdventureWorks2012'
走
-附上
USE [master];
走
创建数据库[AdventureWorks2012]
(
FILENAME = N'C:\ sql server \ files \ AdventureWorks2012_Data.mdf'
)
,
(
FILENAME = N'C:\ sql server \ files \ AdventureWorks2012_Log.ldf'
)
附加;
走
现在,bpool中有什么?
---------------------------
-步骤3:Bpool Stuff?
---------------------------
USE [AdventureWorks2012];
走
选择
OBJECT_NAME(p.object_id)AS [ObjectName]
,p.object_id
,p.index_id
,COUNT(*)/ 128 AS [缓冲区大小(MB)]
,COUNT(*)AS [buffer_count]
从
sys.allocation_units AS a
内联接sys.dm_os_buffer_descriptors AS b
开启a.allocation_unit_id = b.allocation_unit_id
内部联接系统分区AS p
开启a.container_id = p.hobt_id
哪里
b.database_id = DB_ID()
AND p.object_id> 100
通过...分组
p.object_id
,p.index_id
订购
buffer_count DESC;
结果:

此时所有读取是否合乎逻辑?
--------------------------------
-步骤4:逻辑只读?
--------------------------------
USE [AdventureWorks2012];
走
将统计信息IO设置为ON;
SELECT * FROM DatabaseLog;
走
将统计信息设置为“关闭”;
/ *
(受影响的1597行)
表“ DatabaseLog”。扫描计数1,逻辑读782,物理读0,预读768,lob逻辑读94,lob物理读4,lob预读24。
* /
我们可以看到,缓冲池并没有被分离/连接完全吹走。好像我的朋友错了。是否有人不同意或有更好的论据?
另一种选择是使数据库脱机然后再联机。让我们尝试一下。
--------------------------------
-步骤5:离线/在线?
--------------------------------
ALTER DATABASE [AdventureWorks2012]设置离线;
走
ALTER DATABASE [AdventureWorks2012]设置在线;
走
---------------------------
-步骤6:Bpool Stuff?
---------------------------
USE [AdventureWorks2012];
走
选择
OBJECT_NAME(p.object_id)AS [ObjectName]
,p.object_id
,p.index_id
,COUNT(*)/ 128 AS [缓冲区大小(MB)]
,COUNT(*)AS [buffer_count]
从
sys.allocation_units AS a
内联接sys.dm_os_buffer_descriptors AS b
开启a.allocation_unit_id = b.allocation_unit_id
内部联接系统分区AS p
开启a.container_id = p.hobt_id
哪里
b.database_id = DB_ID()
AND p.object_id> 100
通过...分组
p.object_id
,p.index_id
订购
buffer_count DESC;
看来离线/在线操作要好得多。
