Có tách / Đính kèm hoặc Ngoại tuyến / Trực tuyến Xóa Bộ đệm Bộ đệm cho Cơ sở dữ liệu Cụ thể không?


8

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:

AW mập lên

---------------------------
- 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: nhập mô tả hình ảnh ở đâ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ả: nhập mô tả hình ảnh ở đây

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.

nhập mô tả hình ảnh ở đây

Câu trả lời:


9

Tôi ban đầu nghĩ rằng bạn đang ở một cái gì đó ở đây. Giả định làm việc nằm dọc theo dòng có lẽ vùng đệm không ngay lập tức bị xóa vì nó yêu cầu "một số công việc" phải làm như vậy và tại sao phải bận tâm cho đến khi bộ nhớ được yêu cầu. Nhưng...

Bài kiểm tra của bạn là thiếu sót.

Những gì bạn đang thấy trong nhóm bộ đệm là các trang được đọc là kết quả của việc đính kèm lại cơ sở dữ liệu, chứ không phải phần còn lại của phiên bản trước của cơ sở dữ liệu.

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?

Đúng. Bạn đang hiểu physical reads 0là có nghĩa là không có bất kỳ đọc vật lý nào

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.

Như được mô tả trên blog của Craig Freedman, cơ chế đọc trước tuần tự cố gắng đảm bảo rằng các trang nằm trong bộ nhớ trước khi chúng được bộ xử lý truy vấn yêu cầu, đó là lý do tại sao bạn thấy số không hoặc thấp hơn số lượng đọc vật lý dự kiến ​​được báo cáo.

Khi SQL Server thực hiện quét tuần tự một bảng lớn, công cụ lưu trữ sẽ khởi tạo cơ chế đọc trước để đảm bảo rằng các trang nằm trong bộ nhớ và sẵn sàng quét trước khi chúng cần bộ xử lý truy vấn. Cơ chế đọc trước cố gắng ở lại 500 trang trước khi quét.

Không có trang nào được yêu cầu để đáp ứng truy vấn của bạn trong bộ nhớ cho đến khi đọc trước đặt chúng ở đó.

Về lý do tại sao kết quả trực tuyến / ngoại tuyến trong một hồ sơ nhóm bộ đệm khác nhau đảm bảo điều tra nhàn rỗi hơn một chút. @MarkSRasmussen có thể giúp chúng tôi giải quyết lần sau khi anh ấy đến thăm.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.