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

SQL Server - Khám phá nội bộ của sp_spaceused

Bài viết này là một nỗ lực để phân tích đầu ra của sp_spaceused thủ tục được lưu trữ.

Giới thiệu

Việc hiểu rõ nội bộ sử dụng cơ sở dữ liệu và xu hướng tăng trưởng đóng một vai trò quan trọng trong việc xác định kích thước phù hợp của cơ sở dữ liệu. sp_spaceused có lẽ là thủ tục được lưu trữ trong hệ thống được thực thi rộng rãi nhất của quản trị viên để tìm dung lượng đĩa được cơ sở dữ liệu sử dụng. Điều này giúp bạn có cái nhìn sơ lược về việc sử dụng cơ sở dữ liệu. số liệu thống kê. sp_spaceused được sử dụng để hiển thị số hàng, kích thước dữ liệu, kích thước chỉ mục, lượng không gian đã sử dụng, không gian chưa sử dụng theo từng đối tượng và kích thước chưa phân bổ của cơ sở dữ liệu. Mặc dù nhìn vào các giá trị do sp_spaceused đưa ra, người ta không nên nghĩ đến việc thu nhỏ cơ sở dữ liệu hoặc tệp dữ liệu hoặc tệp nhật ký. Đôi khi, chúng ta không nhận thức được những gì chúng ta đang làm. Đôi khi, chúng tôi không biết hậu quả của việc thực hiện các hoạt động nội tại tài nguyên như vậy là gì. Kết quả của sp_spaceused cho chúng ta biết rất nhiều về hiệu suất hiện tại của cơ sở dữ liệu. Chưa phân bổ và cột không sử dụng cho chúng tôi biết dung lượng trống còn lại trong cơ sở dữ liệu và các cấp bảng.

Bài viết này xem xét:

  1. Xem trước sp_spaceused
  2. Tác động của cài đặt tự động tăng trưởng đối với các cột, chưa được phân bổ và không được sử dụng
  3. Tìm thông tin chi tiết về việc sử dụng dung lượng ở cơ sở dữ liệu và các cấp phiên bản
  4. Đo lường các sự kiện tăng trưởng tự động
  5. Tìm kích thước tệp mdf và ldf
  6. Các yếu tố xác định hiệu suất của cơ sở dữ liệu
  7. Và hơn thế nữa…

Nội bộ của sp_spaceused

Chụp chi tiết sử dụng không gian của tất cả các bảng

Trong T-SQL bên dưới, thủ tục lưu trữ không có tài liệu sp_MSforeachtable được sử dụng để duyệt qua tất cả các bảng trong phạm vi của ngữ cảnh cơ sở dữ liệu hiện tại để lấy số liệu sử dụng không gian của tất cả các bảng trong ngữ cảnh.

 Khai báo bảng @tbl_sp_spaceused (tên varchar (100) NULL, các hàng bigint NULL, varchar dành riêng (20) NULL, data varchar (20) NULL, index_size varchar (20) NULL, varchar không sử dụng (20) NULL) - chèn đầu ra của sp_spaceused tới biến bảng 

Nắm bắt chi tiết sử dụng không gian của tất cả các cơ sở dữ liệu

Thủ tục lưu trữ không có tài liệu sp_MSforeachDB được sử dụng để duyệt qua toàn bộ cơ sở dữ liệu trong phạm vi của phiên bản SQL hiện tại để lấy thông tin sử dụng không gian của tất cả các cơ sở dữ liệu.

 khai báo bảng @tbl_sp_spaceusedDBs (database_name varchar (100) NOT NULL, database_size varchar (50) NULL, chưa phân bổ varchar (30) NULL, dành riêng varchar (20) NULL, dữ liệu varchar (20) NULL, index_size varchar (20) NULL , varchar không sử dụng (20) NULL) CHÈN VÀO @tbl_sp_spaceusedDBs (database_name, database_size, chưa phân bổ, dành riêng, dữ liệu, index_size, chưa sử dụng) EXEC sp_msforeachdb @ command1 ="use? execute sp_spaceused @oneresultset =1" SELECT * FROM @tbl_sp_spaceused database database_size 

Đây, database_name là tên của cơ sở dữ liệu; trong trường hợp này, PythonSample . database_size là U nallocated + Reserved + Data + Index + Unused =MDF + LDF (=848 MB trong trường hợp này). Chưa phân bổ dung lượng ở đây là 51,94 MB.

Trên thực tế, đây là ranh giới đĩa đã được đánh dấu cho cơ sở dữ liệu. Đầu ra sp_spaceused tạo ra cột chưa được phân bổ được xác định ở cấp cơ sở dữ liệu và nó không được dành riêng cho bất kỳ bảng nào và có thể được thực hiện bởi đối tượng đầu tiên yêu cầu nhiều chỗ để phát triển hơn.

Chưa phân bổ không gian là không gian trống bên trong tệp dữ liệu để nó không phải tự động phát triển mỗi khi bạn đưa ra truy vấn; thông thường, SQL Server Storage Engine quản lý tự động phát triển bằng cách sử dụng một cơ chế được gọi là Thuật toán điền theo tỷ lệ. Việc quản lý các phạm vi được thực hiện một cách hiệu quả dựa trên số lần ghi xảy ra trên các tệp. Và đồng thời, khi không gian đã sử dụng đạt đến một ngưỡng, một sự kiện sẽ được kích hoạt để tự động phát triển thêm. Việc đặt giá trị phù hợp của không gian chưa được phân bổ phụ thuộc vào nhu cầu và tình huống cũng như bản chất của việc sử dụng cơ sở dữ liệu. Không gian chưa được phân bổ là không gian chưa được sử dụng và đang "cần lấy". Về bản chất, các phạm vi này được đánh dấu bằng bit 1 trong trang GAM. Hiểu khái niệm về tự phát triển ở trên, bất kỳ loại tăng trưởng nào cũng có thể tạo ra các phạm vi tăng trưởng chưa được phân bổ hơn nữa.

Sử dụng truy vấn SQL sau, chúng ta có thể thấy số lần sự kiện tăng trưởng tự động được tạo, cùng với lượng thời gian cơ sở dữ liệu đã giữ cho quá trình.

 DECLARE @fname NVARCHAR (1000); - Lấy tên của traceid mặc định hiện tại @fname =CAST (value AS VARCHAR (MAX)) FROM ::fn_trace_getinfo (DEFAULT) WHERE traceid =1 AND property =2; SELECT ft.StartTime [Thời gian bắt đầu], t.name [Tên sự kiện], DB_NAME (ft.databaseid) [Tên cơ sở dữ liệu], ft.Filename [Tên tệp], (ft.IntegerData * 8) /1024.0 [Growth MB], ( ft.duration / 1000) [Duration MS] FROM ::fn_trace_ctures (@fname, DEFAULT) AS ft INNER JOIN sys.trace_events AS t ON ft.EventClass =t.trace_event_id WHERE (ft.EventClass =92 - DateFile Auto-growth HOẶC ft.EventClass =93) - LogFile Auto-growthORDER BY ft.StartTime 

Hãy xem ý nghĩa của từng thuật ngữ:

Được bảo lưu :Không gian dành riêng cho các đối tượng cơ sở dữ liệu =( Dữ liệu + Chỉ mục + Không được sử dụng ) =476704 + 1280 + 1312 =479296 KB. Điều này cho biết mức độ đầy đủ của các đối tượng; lý tưởng là 10% không gian chưa sử dụng được mong đợi cho các bảng giao dịch.

Dữ liệu :Kích thước thực của dữ liệu. Đây là tổng của tất cả các tệp dữ liệu của cơ sở dữ liệu.

Chỉ mục :Lượng không gian được sử dụng bởi chỉ mục.

Lưu ý:Trong một số trường hợp, tôi thấy rằng kích thước của kích thước chỉ mục lớn hơn kích thước của dữ liệu thực tế. Liên quan đến các chỉ mục, những gì cần thiết cho hệ thống luôn phụ thuộc vào hiệu suất của cơ sở dữ liệu. Nhiều khi, các thao tác đọc quan trọng hơn các thao tác ghi. Và trong một số trường hợp khác, bài viết quan trọng hơn bài đọc. Trong trường hợp doanh nghiệp quyết định rằng số lần đọc quan trọng hơn nhiều so với số lần ghi, hệ thống đó có thể cần rất nhiều chỉ mục để đáp ứng các yêu cầu về hiệu suất của doanh nghiệp và người dùng.

Không được sử dụng :Một phần của không gian dành riêng, chưa được sử dụng

Chưa sử dụng là các trang trên phạm vi được phân bổ nhưng chưa được sử dụng bởi bất kỳ đối tượng nào. Ngay sau khi một phạm vi được phân bổ (dưới dạng thống nhất hoặc chung), chúng tôi sẽ nhận được tám trang dành riêng cho phạm vi đó. Một số trang đã được sử dụng và một số trang không được sử dụng.

Không sử dụng chưa được phân bổ các cột trong đầu ra có thể gây nhầm lẫn. Để làm rõ, không sử dụng đầu ra cột không hiển thị lượng không gian trống còn lại trong toàn bộ cơ sở dữ liệu. Thay vào đó, nó là tổng số không gian dành riêng cho các bảng nhưng không chứa đầy dữ liệu. Trong nhiều trường hợp, không gian chưa sử dụng có thể được lấy lại bằng cách tạo chỉ mục được phân nhóm hoặc quản lý các chỉ mục hiện có.

Đầu ra của sp_spaceused có thể được đơn giản hóa hơn nữa để tìm kích thước của tệp .mdf và tệp .log. Tổng của không gian dành riêng và không gian chưa được phân bổ nhiều hơn hoặc nhỏ hơn bằng kích thước của tệp dữ liệu — hoặc MDF —. Ngoài ra, trừ kích thước tệp MDF khỏi kích thước cơ sở dữ liệu sẽ cho kích thước tệp nhật ký.

Vì vậy, đây là hai công thức:

Kích thước của tệp MDF =không gian dành riêng + chưa được phân bổ

Kích thước của tệp nhật ký =Database_Size - Kích thước tệp MDF

 CHỌN 476704+ 1280+ 1312 'KB dành riêng', (479296 / 1024,00) +51,94 'MDFSizeMB', 848,00 - ((479296 / 1024,00) +51,94) 'LogSizeMB' 

Các điểm đã đề cập ở trên cho chúng ta biết mỗi cột trong đầu ra của sp_spaceused được diễn giải, tính toán và phân tích như thế nào.

Tác động của cài đặt tự động tăng trưởng

Kích thước ban đầu và cấu hình tự động tăng trưởng có ảnh hưởng đáng kể đến không gian chưa sử dụng. Đặt các giá trị phù hợp cho những giá trị này là một thách thức. Tôi đã thấy nhiều trường hợp tăng trưởng tự động được thiết lập để phát triển theo tỷ lệ phần trăm. Giả sử rằng tốc độ tăng trưởng tự động được đặt ở 25% cho kích thước tệp dữ liệu là 100 GB. Chỉ cần 4 sự kiện tự động tăng trưởng để lấp đầy ổ đĩa.

Trường hợp còn lại là xây dựng lại các chỉ mục. Thao tác này có tác động trực tiếp đến không gian chưa sử dụng của bảng, vì dữ liệu được cấu trúc lại giữa các phạm vi đồng nhất và hỗn hợp. Trong một số trường hợp, trong khi sắp xếp lại các trang, thao tác này có thể tạo ra không gian chưa được phân bổ do cài đặt tự động tăng trưởng của tệp dữ liệu.

Hãy xem xét một tình huống trong đó cài đặt tự động tăng trưởng không được đặt đúng trên cơ sở dữ liệu. Đây lại là một vấn đề:Nếu tính năng tự động tăng trưởng được bật trên cơ sở dữ liệu, điều đó có nghĩa là quá trình mở rộng ổ đĩa diễn ra tự động trong một số sự kiện ngay cả khi dữ liệu không sử dụng hết dung lượng.

Luôn luôn là một phương pháp hay để đặt cài đặt tự động tăng trưởng thích hợp cho tệp dữ liệu. Đôi khi, việc thiết lập tệp dữ liệu không chính xác có thể tạo ra sự phân mảnh vật lý, dẫn đến hệ thống bị giảm hiệu suất nghiêm trọng. Nói cách khác, nếu bạn không có không gian chưa được phân bổ, dữ liệu mới sẽ cố gắng nằm ở những vị trí trống có thể bị phân tán. Điều này cũng áp dụng cho tệp nhật ký. Không gian chưa được phân bổ trong cơ sở dữ liệu ảnh hưởng gián tiếp đến cài đặt tự động tăng trưởng của tệp dữ liệu và tệp nhật ký và ảnh hưởng trực tiếp đến hiệu suất. Chìa khóa của họ là tìm ra sự cân bằng phù hợp.

Kết thúc

  1. Trong quá trình tạo cơ sở dữ liệu, kích thước được xác định (tức là kích thước ban đầu) không là gì khác ngoài kích thước thực của cơ sở dữ liệu. Kích thước ban đầu này được ghi lại trong Tiêu đề trang. Trong quá trình thu nhỏ cơ sở dữ liệu, quá trình sử dụng kích thước tối thiểu là thuộc tính tham chiếu, chỉ khi kích thước dữ liệu thực tế nhỏ hơn kích thước tối thiểu — kích thước tối thiểu cũng được tìm thấy trong Tiêu đề trang và có thể được nhìn thấy bằng cách sử dụng lệnh DBCC PAGE. Ngoài ra, quy trình tương tự cũng tốt cho DBCC SHRINKFILE, quy trình này thu nhỏ các tệp xuống nhỏ hơn kích thước ban đầu của chúng.
  2. Bạn không nên thu nhỏ cơ sở dữ liệu để giải phóng dung lượng ổ đĩa, mặc dù, quyết định phụ thuộc vào tình huống — các tình huống bất thường có thể dẫn đến một hành động không theo quy luật. Tuy nhiên, người ta phải nhớ rằng việc thu nhỏ cơ sở dữ liệu sẽ dẫn đến sự phân mảnh trong cơ sở dữ liệu. Luôn luôn là một phương pháp hay để phân tích nguyên nhân gốc rễ của không gian chưa được phân bổ không gian chưa sử dụng của các đối tượng. Trong nhiều trường hợp, mở rộng ổ đĩa để xử lý tốc độ tăng dữ liệu sẽ là một lựa chọn khả thi / được khuyến nghị.
  3. Cấu hình tự động phát triển:Khi SQL Server thực hiện thao tác tự động phát triển, giao dịch đã kích hoạt sự kiện tự động phát triển sẽ phải đợi cho đến khi sự kiện tự động phát triển hoàn tất. Chỉ khi đó, giao dịch mới có thể tự hoàn thành.
  4. Bạn luôn nên đặt các tùy chọn tăng trưởng tự động theo số thay vì phần trăm.
  5. Việc tạo ra không gian chưa sử dụng trong bảng có thể là do các lý do sau:
    • Phân mảnh
      Khi dữ liệu bị phân mảnh do bản chất và kiểu định nghĩa của nó, một số không gian không sử dụng được tạo ra. Ngoài ra, việc sửa đổi dữ liệu thường xuyên (Tất cả các thao tác CẬP NHẬT, CHÈN HOẶC XÓA) dẫn đến số lần tách trang nhiều hơn, điều này có nhiều khả năng tạo ra không gian không sử dụng trong bảng.
    • Không có chỉ mục được phân cụm trên bảng
      Để giảm phân mảnh trong một Heap, người ta có thể nghĩ đến việc tạo chỉ mục được phân nhóm trên bàn. Để giảm phân mảnh chỉ mục, hãy thực hiện duy trì chỉ mục bằng cách xác định giá trị avg_fragmentation_in_percent.
    • Kích thước của dữ liệu
      Trong một số trường hợp, việc sử dụng Kiểu dữ liệu thích hợp mang lại các hàng dữ liệu nhỏ hơn, do đó nó cho phép đặt nhiều hàng hơn trong một trang. Nó không chỉ làm giảm không gian không sử dụng bên trong mà còn có tác động đến hiệu suất bằng cách giảm số lần tách trang.
  6. Khoảng trống không sử dụng cũng có thể là kết quả của việc giảm cột có độ dài thay đổi. Sử dụng DBCC CLEANTABLE sau khi bạn thực hiện các thay đổi đáng kể đối với các cột có độ dài thay đổi trong bảng hoặc chế độ xem được lập chỉ mục để lấy lại ngay không gian chưa sử dụng. Ngoài ra, bạn có thể xây dựng lại các chỉ mục trên bảng hoặc dạng xem; tuy nhiên, đây là một hoạt động sử dụng nhiều tài nguyên hơn.
  7. Dung lượng chưa sử dụng tương đối lớn hơn khi chúng tôi tải dữ liệu tương đối lớn hơn (> 8 KB). Trong những trường hợp như vậy, chúng ta sẽ nhận được một lượng lớn không gian chưa sử dụng trên các trang dữ liệu.
  8. Sau khi SharePoint Migration, người ta có thể thấy một lượng lớn dung lượng chưa sử dụng được đưa vào cơ sở dữ liệu. Quá trình khai hoang diễn ra chậm hơn, quá trình dọn dẹp ma sẽ xóa các trang này và quá trình giải phóng sẽ diễn ra trong một khoảng thời gian.
  9. Trong một số trường hợp, các giá trị của sp_spaceused có thể không chính xác. Mặc dù sp_spaceused lấy thông tin của nó từ đối tượng hệ thống chứa tất cả các ước tính, nhưng đôi khi nó có thể không chính xác. Một trong những lý do cho điều này là trong quá trình di chuyển cơ sở dữ liệu, hoặc trong trường hợp thống kê lỗi thời, hoặc khi hệ thống đang trải qua các sửa đổi DDL thường xuyên hoặc sau khi thực hiện các hoạt động sao chép hàng loạt lớn. Để đồng bộ hóa các đối tượng hệ thống, hãy sử dụng câu lệnh DBCC updateusage (0) hoặc DBCC CHECKTABLE để đảm bảo rằng sp_spaceused trả về dữ liệu chính xác cập nhật. Tuy nhiên, hãy nhớ rằng các lệnh DBCC sử dụng nhiều tài nguyên; hiểu rõ về hàm ý của việc sử dụng nó. Khi chúng tôi thực thi lệnh cập nhật DBCC, Công cụ cơ sở dữ liệu máy chủ SQL sẽ quét các trang dữ liệu trong cơ sở dữ liệu và thực hiện các chỉnh sửa cần thiết đối với sys.allocation_units sys.partitions chế độ xem danh mục liên quan đến không gian lưu trữ được sử dụng bởi mỗi bảng.

Tài liệu tham khảo

  • https://msdn.microsoft.com/en-us/library/cc280360.aspx
  • https://docs.microsoft.com/en-us/sql/t-sql/database-console-commands/dbcc-cleantable-transact-sql
  • https://docs.microsoft.com/en-us/sql/relational-databases/system-catalog-views/sys-database-files-transact-sql

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tìm, ưu tiên và giải quyết các sự cố máy chủ SQL trong vài phút

  2. 4 cách để kiểm tra xem một bảng có tồn tại hay không trước khi loại bỏ nó trong SQL Server (T-SQL)

  3. Kích hoạt SQL Server:Kích hoạt DML

  4. Cách tổng hợp trường thời gian trong SQL Server

  5. SQL, bảng số bổ trợ