Seorang teman saya mengatakan kepada saya hari ini bahwa alih-alih memantulkan SQL Server, saya cukup melepaskan dan kemudian melampirkan kembali database dan tindakan ini akan menghapus halaman dan rencana basis data yang diberikan dari cache. Saya tidak setuju dan memberikan bukti saya di bawah. Jika Anda tidak setuju dengan saya atau memiliki bantahan yang lebih baik, daripada dengan cara apa pun menyediakannya.
Saya menggunakan AdventureWorks2012 pada versi SQL Server ini:
SELECT @@ VERSION; Microsoft SQL Server 2012 - 11.0.2100.60 (X64) Edisi Pengembang (64-bit) pada Windows NT 6.1 (Build 7601: Service Pack 1)
Setelah memuat basis data, saya menjalankan kueri berikut:
Pertama, jalankan skrip penggemukan AW Jonathan K yang ditemukan di sini:
---------------------------
- Langkah 1: Barang Bpool?
---------------------------
GUNAKAN [AdventureWorks2012];
PERGILAH
PILIH
OBJECT_NAME (p.object_id) AS [ObjectName]
, p.object_id
, p.index_id
, COUNT (*) / 128 AS [ukuran buffer (MB)]
, COUNT (*) AS [buffer_count]
DARI
sys.allocation_units AS a
INNER GABUNG sys.dm_os_buffer_descriptors SEBAGAI b
ON a.allocation_unit_id = b.allocation_unit_id
INNER JOIN sys.partitions AS hal
ON a.container_id = p.hobt_id
DIMANA
b.database_id = DB_ID ()
DAN p.object_id> 100
KELOMPOK OLEH
p.object_id
, p.index_id
DIPESAN OLEH
buffer_count DESC;
Hasilnya ditunjukkan di sini:

Lepaskan dan lampirkan kembali basis data lalu jalankan kembali kueri.
---------------------------
- Langkah 2: Lepaskan / Lampirkan
---------------------------
- Lepaskan
GUNAKAN [master]
PERGILAH
EXEC master.dbo.sp_detach_db @dbname = N'AdventureWorks2012 '
PERGILAH
- Pasang
GUNAKAN [master];
PERGILAH
BUAT DATABASE [AdventureWorks2012] HIDUP
(
FILENAME = N'C: \ sql server \ files \ AdventureWorks2012_Data.mdf '
)
,
(
FILENAME = N'C: \ sql server \ files \ AdventureWorks2012_Log.ldf '
)
UNTUK ATTACH;
PERGILAH
Apa yang ada di bpool sekarang?
---------------------------
- Langkah 3: Barang Bpool?
---------------------------
GUNAKAN [AdventureWorks2012];
PERGILAH
PILIH
OBJECT_NAME (p.object_id) AS [ObjectName]
, p.object_id
, p.index_id
, COUNT (*) / 128 AS [ukuran buffer (MB)]
, COUNT (*) AS [buffer_count]
DARI
sys.allocation_units AS a
INNER GABUNG sys.dm_os_buffer_descriptors SEBAGAI b
ON a.allocation_unit_id = b.allocation_unit_id
INNER JOIN sys.partitions AS hal
ON a.container_id = p.hobt_id
DIMANA
b.database_id = DB_ID ()
DAN p.object_id> 100
KELOMPOK OLEH
p.object_id
, p.index_id
DIPESAN OLEH
buffer_count DESC;
Dan hasilnya:

Apakah semua bacaan logis pada saat ini?
--------------------------------
- Langkah 4: Hanya Baca Logis?
--------------------------------
GUNAKAN [AdventureWorks2012];
PERGILAH
SET STATISTIK IO ON;
SELECT * FROM DatabaseLog;
PERGILAH
SET STATISTIK IO OFF;
/ *
(1597 baris terpengaruh)
Tabel 'DatabaseLog'. Pindai hitungan 1, bacaan logis 782, bacaan fisik 0, bacalah bacaan 768, bacaan logis lob 94, bacaan fisik lob 4, bacalah bacaan baca 24.
* /
Dan kita bisa melihat bahwa buffer pool tidak sepenuhnya terhempas oleh detach / attach. Sepertinya teman saya salah. Adakah yang tidak setuju atau memiliki argumen yang lebih baik?
Pilihan lain adalah offline dan kemudian online database. Mari kita coba itu.
--------------------------------
- Langkah 5: Offline / Online?
--------------------------------
ALTER DATABASE [AdventureWorks2012] SET OFFLINE;
PERGILAH
ALTER DATABASE [AdventureWorks2012] SET ONLINE;
PERGILAH
---------------------------
- Langkah 6: Barang Bpool?
---------------------------
GUNAKAN [AdventureWorks2012];
PERGILAH
PILIH
OBJECT_NAME (p.object_id) AS [ObjectName]
, p.object_id
, p.index_id
, COUNT (*) / 128 AS [ukuran buffer (MB)]
, COUNT (*) AS [buffer_count]
DARI
sys.allocation_units AS a
INNER GABUNG sys.dm_os_buffer_descriptors SEBAGAI b
ON a.allocation_unit_id = b.allocation_unit_id
INNER JOIN sys.partitions AS hal
ON a.container_id = p.hobt_id
DIMANA
b.database_id = DB_ID ()
DAN p.object_id> 100
KELOMPOK OLEH
p.object_id
, p.index_id
DIPESAN OLEH
buffer_count DESC;
Tampaknya operasi offline / online bekerja jauh lebih baik.
