Một người bạn của tôi đã nói với tôi hôm nay rằng thay vì nảy SQL Server, tôi chỉ có thể tách ra và sau đó đính kèm lại một cơ sở dữ liệu và hành động này sẽ xóa các trang và kế hoạch của cơ sở dữ liệu đã cho khỏi bộ đệm. Tôi không đồng ý và cung cấp bằng chứng của tôi dưới đây. Nếu bạn không đồng ý với tôi hoặc có phản bác tốt hơn, bằng mọi cách hãy cung cấp nó.
Tôi đang sử dụng AdventureWorks2012 trên phiên bản SQL Server này:
CHỌN @@ PHIÊN BẢN; Máy chủ Microsoft SQL 2012 - 11.0.2100.60 (X64) Phiên bản dành cho nhà phát triển (64-bit) trên Windows NT 6.1 (Bản dựng 7601: Gói dịch vụ 1)
Sau khi tải cơ sở dữ liệu, tôi chạy truy vấn sau:
Đầu tiên, chạy kịch bản vỗ béo AW của Jonathan K được tìm thấy ở đây:
--------------------------- - Bước 1: Bpool Stuff? --------------------------- SỬ DỤNG [AdventureWorks2012]; ĐI LỰA CHỌN OBarget_NAME (p.object_id) NHƯ [Tên đối tượng] , p.object_id , p.index_id , COUNT (*) / 128 AS [kích thước bộ đệm (MB)] , COUNT (*) NHƯ [đệm_count] TỪ sys.allocation_units NHƯ THAM GIA THAM GIA sys.dm_os_buffer_descriptors NHƯ b TRÊN a.allocation_unit_id = b.allocation_unit_id THAM GIA THAM GIA sys.partitions AS p ON a.container_id = p.hazed_id Ở ĐÂU b.database_id = DB_ID () VÀ p.object_id> 100 NHÓM THEO p.object_id , p.index_id ĐẶT BỞI đệm_count DESC;
Kết quả được hiển thị ở đây:
Tháo và gắn lại cơ sở dữ liệu và sau đó chạy lại truy vấn.
--------------------------- - Bước 2: Tách / Đính kèm --------------------------- - Tách SỬ DỤNG [chính chủ] ĐI EXEC master.dbo.sp_detach_db @dbname = N'AdvojiWorks2012 ' ĐI - Đính kèm SỬ DỤNG [chủ]; ĐI TẠO cơ sở dữ liệu [AdventureWorks2012] TRÊN ( FILENAME = N'C: \ sql server \ files \ AdventureWorks2012_Data.mdf ' ) , ( FILENAME = N'C: \ sql server \ files \ AdventureWorks2012_Log.ldf ' ) CHO ATTACH; ĐI
Bây giờ có gì trong bpool?
--------------------------- - Bước 3: Bpool Stuff? --------------------------- SỬ DỤNG [AdventureWorks2012]; ĐI LỰA CHỌN OBarget_NAME (p.object_id) NHƯ [Tên đối tượng] , p.object_id , p.index_id , COUNT (*) / 128 AS [kích thước bộ đệm (MB)] , COUNT (*) NHƯ [đệm_count] TỪ sys.allocation_units NHƯ THAM GIA THAM GIA sys.dm_os_buffer_descriptors NHƯ b TRÊN a.allocation_unit_id = b.allocation_unit_id THAM GIA THAM GIA sys.partitions AS p ON a.container_id = p.hazed_id Ở ĐÂU b.database_id = DB_ID () VÀ p.object_id> 100 NHÓM THEO p.object_id , p.index_id ĐẶT BỞI đệm_count DESC;
Và kết quả:
Có phải tất cả các bài đọc hợp lý tại thời điểm này?
-------------------------------- - Bước 4: Chỉ đọc logic? -------------------------------- SỬ DỤNG [AdventureWorks2012]; ĐI THIẾT LẬP THỐNG KÊ IO TRÊN; CHỌN * TỪ cơ sở dữ liệuLog; ĐI THIẾT LẬP THỐNG KÊ IO TẮT; / * (1597 hàng bị ảnh hưởng) Bảng 'Cơ sở dữ liệu'. Quét số 1, đọc logic 782, đọc vật lý 0, đọc trước đọc 768, đọc logic lob 94, đọc vật lý lob 4, đọc trước đọc trước 24. * /
Và chúng ta có thể thấy rằng vùng đệm không hoàn toàn bị thổi bay bởi bộ tách / đính kèm. Có vẻ như bạn thân của tôi đã sai. Có ai không đồng ý hoặc có một cuộc tranh luận tốt hơn?
Một tùy chọn khác là ngoại tuyến và sau đó trực tuyến cơ sở dữ liệu. Hãy để chúng tôi thử điều đó.
-------------------------------- - Bước 5: Ngoại tuyến / Trực tuyến? -------------------------------- THAY ĐỔI CƠ SỞ [AdventureWorks2012] SET OFFLINE; ĐI THAY ĐỔI CƠ SỞ [AdventureWorks2012] THIẾT LẬP TRỰC TUYẾN; ĐI --------------------------- - Bước 6: Bpool Stuff? --------------------------- SỬ DỤNG [AdventureWorks2012]; ĐI LỰA CHỌN OBarget_NAME (p.object_id) NHƯ [Tên đối tượng] , p.object_id , p.index_id , COUNT (*) / 128 AS [kích thước bộ đệm (MB)] , COUNT (*) NHƯ [đệm_count] TỪ sys.allocation_units NHƯ THAM GIA THAM GIA sys.dm_os_buffer_descriptors NHƯ b TRÊN a.allocation_unit_id = b.allocation_unit_id THAM GIA THAM GIA sys.partitions AS p ON a.container_id = p.hazed_id Ở ĐÂU b.database_id = DB_ID () VÀ p.object_id> 100 NHÓM THEO p.object_id , p.index_id ĐẶT BỞI đệm_count DESC;
Có vẻ như hoạt động ngoại tuyến / trực tuyến hoạt động tốt hơn rất nhiều.