Database
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Database

Mở rộng việc sử dụng DBCC CLONEDATABASE

Gói Dịch vụ 2 dành cho SQL Server 2014 đã được phát hành vào tháng trước (đọc ghi chú phát hành tại đây) và bao gồm một câu lệnh DBCC mới:DBCC CLONEDATABASE . Tôi rất vui khi thấy lệnh này được giới thiệu, vì nó cung cấp rất dễ dàng cách sao chép giản đồ cơ sở dữ liệu, bao gồm cả số liệu thống kê , có thể được sử dụng để kiểm tra hiệu suất truy vấn mà không yêu cầu tất cả không gian cần thiết cho dữ liệu trong cơ sở dữ liệu. Cuối cùng, tôi đã dành thời gian để kiểm tra DBCC CLONEDATABASE và hiểu những hạn chế, và tôi phải nói rằng nó khá thú vị.

Kiến thức cơ bản

Tôi bắt đầu bằng cách tạo một bản sao của cơ sở dữ liệu AdventureWorks2014 và chạy một truy vấn đối với cơ sở dữ liệu nguồn và sau đó là cơ sở dữ liệu nhân bản:

DBCC CLONEDATABASE (N'AdventureWorks2014', N'AdventureWorks2014_CLONE');
GO
 
SET STATISTICS IO ON;
GO
SET STATISTICS TIME ON;
GO
SET STATISTICS XML ON;
GO
 
USE [AdventureWorks2014];
GO
 
SELECT *
FROM [Sales].[SalesOrderHeader] [h]
JOIN [Sales].[SalesOrderDetail] [d] ON [h].[SalesOrderID] = [d].[SalesOrderID]
ORDER BY [SalesOrderDetailID];
GO
 
USE [AdventureWorks2014_CLONE];
GO
 
SELECT *
FROM [Sales].[SalesOrderHeader] [h]
JOIN [Sales].[SalesOrderDetail] [d] ON [h].[SalesOrderID] = [d].[SalesOrderID]
ORDER BY [SalesOrderDetailID];
GO
 
SET STATISTICS IO OFF;
GO
SET STATISTICS TIME OFF;
GO
SET STATISTICS XML OFF;
GO

Nếu tôi nhìn vào đầu ra I / O và TIME, tôi có thể thấy rằng truy vấn đối với cơ sở dữ liệu nguồn mất nhiều thời gian hơn và tạo ra nhiều I / O hơn, cả hai đều được mong đợi vì cơ sở dữ liệu nhân bản không có dữ liệu trong đó:

/ * Cơ sở dữ liệu NGUỒN * /

Thời gian thực thi của máy chủ SQL:
thời gian CPU =0 mili giây, thời gian đã trôi qua =0 mili giây.

Thời gian biên dịch và phân tích cú pháp SQL Server:
CPU time =0 ms, trôi qua =4 ms.

(121317 hàng bị ảnh hưởng)

Bảng 'SalesOrderHeader'. Quét đếm 0, đọc lôgic 371567, đọc vật lý 0, đọc trước đọc 0, đọc lôgic 0, đọc lôgic vật lý 0, đọc trước lôgic đọc 0.

Bảng 'Bàn làm việc'. Quét đếm 0, đọc lôgic 0, đọc vật lý 0, đọc trước đọc 0, đọc lôgic 0, đọc lôgic vật lý 0, đọc trước lôgic đọc 0.

Bảng 'SalesOrderDetail'. Quét đếm 5, đọc lôgic 1361, đọc vật lý 0, đọc trước đọc 0, đọc lôgic 0, đọc lôgic vật lý 0, đọc trước lôgic đọc 0.

Bảng 'Bàn làm việc'. Quét đếm 0, đọc lôgic 0, đọc vật lý 0, đọc trước đọc 0, đọc lôgic 0, đọc lôgic vật lý 0, đọc trước lôgic đọc 0.

(1 (các) hàng bị ảnh hưởng)

Thời gian thực thi máy chủ SQL:
thời gian CPU =686 mili giây, thời gian đã trôi qua =2548 mili giây.

/ * Cơ sở dữ liệu CLONE * /

Thời gian thực thi của máy chủ SQL:
thời gian CPU =0 mili giây, thời gian đã trôi qua =0 mili giây.

Thời gian biên dịch và phân tích cú pháp SQL Server:
CPU time =12 ms, trôi qua =12 ms.

(0 hàng bị ảnh hưởng)

Bảng 'Bàn làm việc'. Quét đếm 0, đọc lôgic 0, đọc vật lý 0, đọc trước đọc 0, đọc lôgic 0, đọc lôgic vật lý 0, đọc trước lôgic đọc 0.

Bảng 'SalesOrderHeader'. Quét đếm 0, đọc lôgic 0, đọc vật lý 0, đọc trước đọc 0, đọc lôgic 0, đọc lôgic vật lý 0, đọc trước lôgic đọc 0.

Bảng 'SalesOrderDetail'. Quét đếm 5, đọc lôgic 0, đọc vật lý 0, đọc trước đọc 0, đọc lôgic 0, đọc lôgic vật lý 0, đọc trước lôgic đọc 0.

(1 (các) hàng bị ảnh hưởng)

Thời gian thực thi máy chủ SQL:
thời gian CPU =0 ms, thời gian đã trôi qua =83 ms.

Nếu tôi xem xét các kế hoạch thực thi, chúng đều giống nhau đối với cả hai cơ sở dữ liệu ngoại trừ các giá trị thực tế (lượng dữ liệu đã thực sự di chuyển qua kế hoạch):

Kế hoạch truy vấn cho cơ sở dữ liệu AdventureWorks2014

Kế hoạch truy vấn cho cơ sở dữ liệu AdventureWorks2014_CLONE

Đây là nơi chứa giá trị của DBCC CLONEDATABASE là điều hiển nhiên - tôi có thể nhận được một bản sao trống của cơ sở dữ liệu cho bất kỳ ai (Bộ phận Hỗ trợ Sản phẩm của Microsoft, DBA đồng nghiệp của tôi, v.v.) và yêu cầu họ tạo lại và điều tra sự cố và họ không cần hàng trăm GB dung lượng đĩa để làm nó. Bài đăng ngày thứ Ba T-SQL tháng 7 của Melissa có thông tin chi tiết về những gì xảy ra trong quá trình sao chép, vì vậy tôi khuyên bạn nên đọc để biết thêm thông tin.

Có phải vậy không?

Nhưng… tôi có thể làm được nhiều hơn với DBCC CLONEDATABASE không ? Ý tôi là, điều này thật tuyệt, nhưng tôi nghĩ còn rất nhiều việc khác mà tôi có thể làm với một bản sao trống của cơ sở dữ liệu. Nếu bạn đọc tài liệu cho DBCC CLONEDATABASE , bạn sẽ thấy dòng này:

Dịch vụ hỗ trợ khách hàng của Microsoft có thể yêu cầu bạn tạo một bản sao của cơ sở dữ liệu bằng cách sử dụng DBCC CLONEDATABASE để điều tra sự cố hiệu suất liên quan đến trình tối ưu hóa truy vấn.

Ý nghĩ đầu tiên của tôi là “trình tối ưu hóa truy vấn - hmm… tôi có thể sử dụng điều này làm tùy chọn để thử nghiệm nâng cấp không ? ”

Chà, cơ sở dữ liệu nhân bản ở chế độ chỉ đọc, nhưng tôi nghĩ dù sao thì tôi cũng sẽ cố gắng thay đổi một số tùy chọn. Ví dụ:nếu tôi có thể thay đổi chế độ tương thích, điều đó sẽ thực sự tuyệt vời, vì sau đó tôi có thể kiểm tra các thay đổi CE trong cả SQL Server 2014 và SQL Server 2016.

USE [master];
GO
 
ALTER DATABASE [AdventureWorks2014_CLONE] SET COMPATIBILITY_LEVEL = 110;

Tôi gặp lỗi:

Msg 3906, Level 16, State 1
Không thể cập nhật cơ sở dữ liệu "AdventureWorks2014_CLONE" vì cơ sở dữ liệu ở chế độ chỉ đọc.
Msg 5069, Level 16, State 1
Câu lệnh ALTER DATABASE không thành công.

Hừm. Tôi có thể thay đổi mô hình khôi phục không?

ALTER DATABASE [AdventureWorks2014_CLONE] SET RECOVERY SIMPLE WITH NO_WAIT;

Tôi có thể. Điều đó có vẻ không công bằng. Chà, nó ở chế độ chỉ đọc, tôi có thể thay đổi nó không?

ALTER DATABASE [AdventureWorks2014_CLONE] SET READ_WRITE WITH NO_WAIT;

VÂNG! Trước khi bạn quá phấn khích, hãy để tôi để lại ghi chú này từ tài liệu ngay tại đây:

Lưu ý Cơ sở dữ liệu mới tạo được tạo từ DBCC CLONEDATABASE không được hỗ trợ để sử dụng làm cơ sở dữ liệu sản xuất và chủ yếu dành cho mục đích chẩn đoán và gỡ rối. Chúng tôi khuyên bạn nên tách cơ sở dữ liệu nhân bản sau khi cơ sở dữ liệu được tạo.

Tôi sẽ lặp lại dòng này từ tài liệu và tô đậm nó và đặt nó màu đỏ như một sự thân thiện nhưng cực kỳ quan trọng nhắc nhở:

Cơ sở dữ liệu mới tạo được tạo từ DBCC CLONEDATABASE không được hỗ trợ để sử dụng làm cơ sở dữ liệu sản xuất và chủ yếu dành cho mục đích chẩn đoán và gỡ rối.

Điều đó ổn với tôi, tôi chắc chắn sẽ không sử dụng nó để sản xuất, nhưng bây giờ tôi có thể sử dụng nó để thử nghiệm! BÂY GIỜ tôi có thể thay đổi chế độ tương thích và BÂY GIỜ tôi có thể sao lưu và khôi phục nó trên một phiên bản khác để thử nghiệm!

USE [master];
GO
 
BACKUP DATABASE [AdventureWorks2014_CLONE]
  TO  DISK = N'C:\Backups\AdventureWorks2014_CLONE.bak'
  WITH INIT, NOFORMAT, STATS = 10, NAME = N'AW2014_CLONE_full';
GO
 
/* restore on SQL Server 2016 */
 
 
RESTORE DATABASE [AdventureWorks2014_CLONE]
FROM  DISK = N'C:\Backups\AdventureWorks2014_CLONE.bak' WITH
MOVE N'AdventureWorks2014_Data' TO N'C:\Databases\AdventureWorks2014_Data_2684624044.mdf',
MOVE N'AdventureWorks2014_Log' TO N'C:\Databases\AdventureWorks2014_Log_3195542593.ldf',
NOUNLOAD,  REPLACE,  STATS = 5;
GO
 
ALTER DATABASE [AdventureWorks2014_CLONE] SET COMPATIBILITY_LEVEL = 130;
GO

ĐIỀU NÀY LỚN.

Trong bài đăng cuối cùng của tôi, tôi đã nói về cờ theo dõi 2389 và thử nghiệm với Công cụ ước tính thẻ số mới bởi vì bạn bè, bạn cần để thử nghiệm với CE mới trước khi bạn nâng cấp. Nếu bạn không kiểm tra và nếu bạn thay đổi chế độ tương thích thành 120 (SQL Server 2014) hoặc 130 (SQL Server 2016) như một phần của nâng cấp, thì bạn có nguy cơ làm việc ở chế độ chữa cháy nếu bạn gặp phải. hồi quy với CE mới. Bây giờ, bạn có thể ổn và hiệu suất có thể còn tốt hơn sau khi bạn nâng cấp. Nhưng… bạn có muốn chắc chắn không?

Rất thường xuyên khi tôi đề cập đến việc kiểm tra trước khi nâng cấp, tôi được thông báo rằng không có môi trường nào để thực hiện kiểm tra. Tôi biết một số bạn có môi trường Thử nghiệm. Một số bạn có Test, Dev, QA, UAT và còn ai biết gì nữa. Bạn thật may mắn.

Đối với những người bạn nói rằng bạn không có môi trường thử nghiệm nào để kiểm tra, tôi cung cấp cho bạn DBCC CLONEDATABASE . Với lệnh này, bạn không có lý do gì để không chạy các truy vấn được thực thi thường xuyên nhất và các truy vấn nặng nề đối với bản sao cơ sở dữ liệu của bạn. Ngay cả khi bạn không có môi trường thử nghiệm, bạn vẫn có máy của riêng mình. Sao lưu cơ sở dữ liệu nhân bản từ quá trình sản xuất, bỏ bản sao, khôi phục bản sao lưu vào bản sao cục bộ của bạn, sau đó kiểm tra. Cơ sở dữ liệu sao chép chiếm rất ít dung lượng trên đĩa và bạn sẽ không phải chịu bộ nhớ hoặc tranh chấp I / O vì không có dữ liệu. Bạn sẽ có thể xác thực các kế hoạch truy vấn từ bản sao so với các kế hoạch từ cơ sở dữ liệu sản xuất của bạn. Hơn nữa, nếu bạn khôi phục trên SQL Server 2016, bạn có thể kết hợp Cửa hàng truy vấn vào thử nghiệm của mình! Bật Cửa hàng truy vấn, chạy qua quá trình thử nghiệm của bạn ở chế độ tương thích ban đầu, sau đó nâng cấp chế độ tương thích và kiểm tra lại. Bạn có thể sử dụng Cửa hàng truy vấn để so sánh các truy vấn cạnh nhau! (Bạn có thể cho biết tôi đang nhảy trên ghế của mình ngay bây giờ không?)

Cân nhắc

Một lần nữa, đây không phải là bất cứ thứ gì bạn sẽ sử dụng trong sản xuất và tôi biết bạn sẽ không làm điều đó, nhưng nó sẽ lặp lại vì ở trạng thái hiện tại, DBCC CLONEDATABASE không hoàn toàn đầy đủ . Điều này được lưu ý trong bài viết KB bên dưới các đối tượng được hỗ trợ; các đối tượng như bảng được tối ưu hóa bộ nhớ và bảng tệp không được sao chép, Toàn văn không được hỗ trợ, v.v.

Bây giờ, cơ sở dữ liệu nhân bản không phải là không có nhược điểm. Nếu bạn vô tình chạy xây dựng lại chỉ mục hoặc cập nhật số liệu thống kê trong cơ sở dữ liệu đó, bạn vừa xóa sạch dữ liệu thử nghiệm của mình. Bạn sẽ mất các số liệu thống kê ban đầu, đó là những gì có thể bạn thực sự muốn ngay từ đầu. Ví dụ:nếu tôi kiểm tra thống kê cho chỉ mục nhóm trên SalesOrderHeader ngay bây giờ, tôi nhận được thông báo này:

USE [AdventureWorks2014_CLONE];
GO
DBCC SHOW_STATISTICS (N'Sales.SalesOrderHeader',PK_SalesOrderHeader_SalesOrderID);

Số liệu thống kê ban đầu cho SalesOrderHeader

Bây giờ, nếu tôi cập nhật số liệu thống kê so với bảng đó, tôi nhận được điều này:

UPDATE STATISTICS [Sales].[SalesOrderHeader] WITH FULLSCAN;
GO
 
DBCC SHOW_STATISTICS (N'Sales.SalesOrderHeader',PK_SalesOrderHeader_SalesOrderID);

Thống kê cập nhật (trống) cho SalesOrderHeader

Như một sự an toàn bổ sung, có lẽ bạn nên tắt cập nhật tự động cho số liệu thống kê:

USE [master];
GO
ALTER DATABASE [AdventureWorks2014_CLONE] SET AUTO_UPDATE_STATISTICS OFF WITH NO_WAIT;

Nếu bạn vô tình cập nhật thống kê, hãy chạy DBCC CLONEDATABASE và thực hiện quá trình sao lưu và khôi phục không quá khó và bạn sẽ tự động hóa quá trình này ngay lập tức.

Bạn có thể thêm dữ liệu vào cơ sở dữ liệu. Điều này có thể hữu ích nếu bạn muốn thử nghiệm với thống kê (ví dụ:các tỷ lệ mẫu khác nhau, thống kê được lọc) và bạn có đủ bộ nhớ để giữ bản sao dữ liệu của bảng.

Không có dữ liệu trong cơ sở dữ liệu, rõ ràng bạn sẽ không nhận được thời lượng đại diện và dữ liệu I / O đáng tin cậy. Vậy là được rồi. Nếu bạn cần dữ liệu về việc sử dụng tài nguyên thực sự, thì bạn cần một bản sao cơ sở dữ liệu của mình với tất cả dữ liệu trong đó. DBCC CLONEDATABASE thực sự là về việc kiểm tra hiệu suất truy vấn; đó là nó. Nó không phải là sự thay thế cho kiểm tra nâng cấp truyền thống theo bất kỳ cách nào - nhưng nó là một tùy chọn mới để xác thực cách SQL Server tối ưu hóa truy vấn với các phiên bản và chế độ tương thích khác nhau. Chúc bạn thử nghiệm vui vẻ!


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Union - Hướng dẫn Toàn diện về Toán tử UNION

  2. Thông báo về tính khả dụng chung của trình quản lý tuân thủ SQL 5.9

  3. Tải dữ liệu lớn nhanh hơn

  4. Mô hình Dịch vụ PAAS hoạt động như thế nào?

  5. Cách lấy tháng từ ngày trong T-SQL