私の友人は今日、SQL Serverをバウンスする代わりに、データベースをデタッチしてから再アタッチするだけで、このアクションにより、指定されたデータベースのページとプランをキャッシュからクリアできると私に言った。私は同意せず、以下の証拠を提供します。あなたが私に同意しない場合、またはより良い反論がある場合は、必ずそれを提供してください。
このバージョンのSQL ServerでAdventureWorks2012を使用しています。
SELECT @@ VERSION; Microsoft SQL Server 2012-11.0.2100.60(X64) Windows NT 6.1(Build 7601:Service Pack 1)上のDeveloper Edition(64ビット)
データベースをロードしたら、次のクエリを実行します。
まず、ここにあるJonathan 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 INNER JOIN sys.dm_os_buffer_descriptors AS b ON a.allocation_unit_id = b.allocation_unit_id INNER JOIN sys.partitions AS p ON a.container_id = p.hobt_id どこ b.database_id = DB_ID() AND p.object_id> 100 GROUP BY p.object_id 、p.index_id 注文する buffer_count DESC;
結果は次のとおりです。
データベースを切断して再接続し、クエリを再実行します。
--------------------------- -ステップ2:デタッチ/アタッチ --------------------------- -切り離す USE [マスター] 行く EXEC master.dbo.sp_detach_db @dbname = N'AdventureWorks2012 ' 行く -添付 USE [マスター]; 行く CREATE DATABASE [AdventureWorks2012]オン ( FILENAME = N'C:\ sql server \ files \ AdventureWorks2012_Data.mdf ' ) 、 ( FILENAME = N'C:\ sql server \ files \ AdventureWorks2012_Log.ldf ' ) アタッチ用; 行く
現在、プールには何がありますか?
--------------------------- -ステップ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 INNER JOIN sys.dm_os_buffer_descriptors AS b ON a.allocation_unit_id = b.allocation_unit_id INNER JOIN sys.partitions AS p ON a.container_id = p.hobt_id どこ b.database_id = DB_ID() AND p.object_id> 100 GROUP BY p.object_id 、p.index_id 注文する buffer_count DESC;
そしてその結果:
この時点ですべての読み取りは論理的ですか?
-------------------------------- -ステップ4:論理読み取りのみ? -------------------------------- USE [AdventureWorks2012]; 行く 統計IOをオンに設定します。 SELECT * FROM DatabaseLog; 行く SET STATISTICS IO OFF; / * (1597行が影響を受けました) テーブル 'DatabaseLog'。スキャンカウント1、論理読み取り782、物理読み取り0、先読み読み取り768、LOB論理読み取り94、LOB物理読み取り4、LOB先読み読み取り24。 * /
そして、バッファープールがデタッチ/アタッチによって完全に吹き飛ばされていないことがわかります。私の相棒は間違っていたようです。誰かが同意しないか、より良い議論がありますか?
別のオプションは、データベースをオフラインにしてからオンラインにすることです。それを試してみましょう。
-------------------------------- -ステップ5:オフライン/オンライン? -------------------------------- ALTER DATABASE [AdventureWorks2012] SET OFFLINE; 行く ALTER DATABASE [AdventureWorks2012] SET ONLINE; 行く --------------------------- -ステップ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 INNER JOIN sys.dm_os_buffer_descriptors AS b ON a.allocation_unit_id = b.allocation_unit_id INNER JOIN sys.partitions AS p ON a.container_id = p.hobt_id どこ b.database_id = DB_ID() AND p.object_id> 100 GROUP BY p.object_id 、p.index_id 注文する buffer_count DESC;
オフライン/オンライン操作の方がはるかにうまく機能しているようです。