2009-04-21 41 views
12

Tôi có một kịch bản mà mỗi người dùng đã được phân bổ 2 MB không gian cơ sở dữ liệu. Bây giờ tôi phải hiển thị Percenatge cách sử dụng không gian được phân bổ của họ, để làm như vậy tôi cần phải biết kích thước của bản ghi duy nhất trong Bảng.Kích thước của một bản ghi? SQL

Tôi đã cố gắng sử dụng sp_spaceused và thậm chí đã viết một thủ tục tùy chỉnh sử dụng datalength .. nhưng chúng cho thấy sự khác biệt lớn trong kết quả của họ.

Có cách nào để giải quyết vấn đề này không.

+0

này "không gian" là gì sử dụng cho? –

+2

Bạn phân vùng dữ liệu người dùng của mình như thế nào? Có tất cả trong cùng một bảng không? Hay mỗi người dùng có bảng riêng của họ? –

+0

Tôi có một Bảng nơi lưu tất cả dữ liệu người dùng. UserId được sử dụng để phân biệt dữ liệu người dùng cá nhân –

Trả lời

0

Dữ liệu được lưu trên đĩa trong các thư mục được đặt tên cho cơ sở dữ liệu. Điều đó bao gồm mọi thứ, bao gồm cả những gì bạn không đo lường (chỉ số, v.v.). Đo lường điều đó.

+0

Cách đo lường những gợi ý đó sẽ hữu ích –

10

Bạn có thể tính kích thước một hàng (số hàng) với công thức khá phức tạp. Xem Books Online (ms-help: //MS.SQLCC.v9/MS.SQLSVR.v9.en/udb9/html/81fd5ec9-ce0f-4c2c-8ba0-6c483cea6c75.htm) để biết chi tiết chính xác.

Tóm tắt:

Lấy số lượng cột và xác định kích thước của từng cột theo kiểu dữ liệu cho kiểu dữ liệu có độ dài cố định.

Tính không gian sử dụng cho bất kỳ cột nullable Sau đó tính toán rowspace:

Row_Size = Fixed_Data_Size + Variable_Data_Size + Null_Bitmap + 4

+1

Liên kết Sách tuyệt vời Trực tuyến, cảm ơn bạn. – DenNukem

24

Run DBCC SHOWCONTIG với tên bảng của bạn

dbcc showcontig ('TableName') with tableresults 

sau đó nhìn tối đa và kích thước bản ghi trung bình

+6

đơn vị của các kích thước mà bạn đã đề cập là KB hoặc B – semirturgay

+0

https://msdn.microsoft.com/en-us/library/ms175008.aspx - Nhìn vào điều này tôi tin rằng đó là Bytes – JsonStatham

+0

FYI, theo trang MSDN được liên kết: "Tính năng này sẽ bị xóa trong phiên bản tương lai của Microsoft SQL Server. Không sử dụng tính năng này trong công việc phát triển mới và sửa đổi các ứng dụng hiện đang sử dụng tính năng này càng sớm càng tốt. Sử dụng sys.dm_db_index_physical_stats thay thế." – DaveD

11

Truy vấn sau đây sẽ cho bạn biết tỷ lệ phần trăm của @SpaceAllotted đang được sử dụng bởi dữ liệu bằng cách xem có bao nhiêu trang được phân bổ bởi các đối tượng của cơ sở dữ liệu.

Không đáng để đo mức sử dụng ở cấp hàng, vì SQL Server phân bổ tất cả không gian ở cấp độ. Mỗi phạm vi bao gồm tám trang dữ liệu 8KB. Vì vậy, nếu cơ sở dữ liệu của bạn chỉ có một hàng và hàng đó có 4 byte dữ liệu, toàn bộ phạm vi vẫn cần phải được cấp phát để giữ 4 byte đó (hoặc mức hiện tại với các trang chưa được phân bổ sẽ được sử dụng.).

DECLARE @SpaceAllotted  FLOAT 
-- 2MB converted to kilobytes... 
SET  @SpaceAllotted = 2048 

SELECT 
    -- Allocation is done on the extent-level. 
    -- Each extent contains eight 8KB data pages. 
    ((1/(@SpaceAllotted)) * CEILING(CAST(SUM([ips].[page_count]) AS FLOAT)/8) * 64) * 100 AS PercentageUsed 
FROM 
    [sys].[dm_db_index_physical_stats](DB_ID(), NULL, NULL, NULL, NULL) ips 
    -- This will allow us to retrieve the page count of all tables in the 
    -- current database, regardless of whether or not they have clustered 
    -- indexes and/or non-clustered indexes. 
INNER JOIN 
    [sys].[indexes] i 
    ON 
     [ips].[object_id] = [i].[object_id] 
    AND [ips].[index_id] = [i].[index_id] 

Kể từ khi chúng tôi có khả năng mức độ hỗn hợp, và không tốt chiều (có nhiều cách, nhưng họ sẽ không được khá) xác định những gì trang được phân bổ cho những gì mức độ, isn này chính xác 100%. Ngoài ra, các phạm vi mở rộng thậm chí có thể có các trang miễn phí (được dành riêng và do đó vẫn chiếm dung lượng đĩa), vì vậy thông thường, ước tính này sẽ luôn ở mức thấp. Tuy nhiên, nó có lẽ là tốt nhất bạn sẽ nhận được mà không cần viết một cái gì đó để kiểm tra cơ sở dữ liệu ở cấp độ trang.

Có, hãy xem các câu trả lời khác, đây là một tùy chọn khác. Điều này về cơ bản sẽ xem xét tất cả các kích thước hiện tại của các tập tin dữ liệu trong các trang, và xác định tỷ lệ phần trăm của không gian mà họ đã tiêu thụ. Bây giờ, hãy cẩn thận ở đây ...

  • Nếu không có kích thước tối đa quy định cho cơ sở dữ liệu (autogrowth được kích hoạt và không hạn chế), điều này sẽ không bay, kể từ MAX_SIZE sẽ được trả lại như -1.
  • Một lần nữa, chúng tôi không thể xác định chính xác khoảng không gian được sử dụng bởi dữ liệu thực tế. Ở đây chúng tôi đang xem xét bao nhiêu không gian thực sự được sử dụng trên hệ thống tập tin.
  • Chúng tôi không xem xét dung lượng tệp nhật ký. Có, điều đó vẫn tiêu thụ không gian đĩa.

Hy vọng một trong số này sẽ giải quyết được vấn đề của bạn.

SELECT 
    ((1/CAST(SUM([df].[max_size]) AS FLOAT)) * CAST(SUM([df].[size]) AS FLOAT)) * 100 AS PercentUsed 
FROM 
    [sys].dm_io_virtual_file_stats(DB_ID(), NULL) vfs 
INNER JOIN 
    [sys].[database_files] df 
    ON 
     [vfs].[file_id] = [df].[file_id] 
WHERE 
    [df].[type] = 0 
+0

Chúc tôi có thể bầu cho bạn nhiều lần. :-) –

11

Kể từ SHOWCONTIG sẽ bị phản đối, bạn cũng có thể sử dụng:

SELECT * FROM sys.dm_db_index_physical_stats 
(DB_ID(N'DatabaseName'), OBJECT_ID(N'TableName'), NULL, NULL , 'DETAILED') 
Các vấn đề liên quan