2009-04-21 19 views
12

私はすべてのユーザーに2 MBのデータベース領域が割り当てられているシナリオを持っています。 これで、割り当てられたスペースのPercenatgeの使用状況を表示する必要があります。そのため、テーブルの単一レコードのサイズを知る必要があります。1つのレコードのサイズ? SQL

私はsp_spaceusedを使用しようとしており、datalength ..を使用してカスタムプロシージャを書きましたが、それらの結果には大きな違いがあります。

この問題を回避する方法はありますか。

+0

のために使用されるこの「スペース」とは何ですか? –

+2

どのようにユーザーデータを分割していますか?それはすべて同じテーブルにありますか?または、各ユーザーは独自のテーブルを持っていますか? –

+0

私はすべてのユーザーデータが保存される1つのテーブルを持っています。 UserIdは個々のユーザーデータを区別するために使用されます –

答えて

0

データは、データベースの名前のディレクトリにディスクに保存されます。それには、測定していないもの(指標など)を含むすべてが含まれます。それを測定する。

+0

これらのヒントを測定する方法は役に立ちます –

10

かなり複雑な数式を使用して行(行数の)サイズを計算することができます。詳細については、Books Online(ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.en/udb9/html/81fd5ec9-ce0f-4c2c-8ba0-6c483cea6c75.htm)を参照してください。要するに

は、列の数を取り、固定長データ型のためにそのデータ型によって、各カラムのサイズを決定します。

その後rowspaceを計算する任意のNULL可能列 に使用されるスペースを計算します。

Row_Size = Fixed_Data_Size + Variable_Data_Size + Null_Bitmap + 4

+1

優れた書籍オンラインリンク、ありがとうございます。 – DenNukem

24

実行DBCC SHOWCONTIGあなたのテーブル名で

dbcc showcontig ('TableName') with tableresults 

を、次に見て最大最小および平均レコードサイズで

+6

あなたが言及したサイズの単位は何ですか?KBまたはB – semirturgay

+0

https://msdn.microsoft.com/en-us/library/ms175008.aspx - これを見ると、Bytes – JsonStatham

+0

FYIこの機能は新しい開発作業では使用せず、できるだけ早くこの機能を現在使用しているアプリケーションを変更してください。代わりにsys.dm_db_index_physical_statsを使用してください。 – DaveD

11

データベースのオブジェクトによって割り当てられたページ数を調べることで、データによって使用されている@SpaceAllottedの割合を知ることができます。

SQL Serverはすべての領域をエクステントレベルで割り当てるため、行レベルでの使用状況を測定することはできません。各エクステントは8つの8KBデータページで構成されています。したがって、データベースに1行しかなく、その行に4バイトのデータがある場合は、エクステント全体をその4バイトを保持するために割り当てる必要があります(または未割り当てのページがある既存のエクステントが使用されます)。 )。

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] 

我々は、混合エクステントの可能性、およびページがどのようなエクステントに割り当てられているかを決定する無良い方法(そこの方法があるが、それらはかなりあることするつもりはない)、このISNを持っているので、 100%正確です。さらに、エクステントには空きページ(予約されているためにディスクスペースを占有することさえあります)がある場合もありますので、一般的にこの見積もりは常に低くなります。しかし、おそらく、ページレベルでデータベースを検査する何かを書かずに取​​得するのが最善でしょう。

ああ、他の回答を見ると、これは別のオプションです。これは、基本的に、ページ内のデータファイルの現在のサイズをすべて調べ、消費したスペースの割合を決定します。今、ここにも警告があります...

  • データベースに指定した最大サイズは(自動拡張が有効になっていて、無制限れる)がない場合はMAX_SIZE-1として返されるので、これは、飛ぶことはありません。
  • また、実際のデータがどれくらいのスペースを使用しているかを正確に判断することはできません。ここでは、実際にファイルシステム上でどれだけのスペースが使用されているかを見ていきます。
  • 私たちはログファイルの領域を見ていません。はい、それでもディスクスペースを消費します。

これらのいずれかが問題を解決します。

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

願い私はあなたのために複数回投票することができました。 :-) –

11

SHOWCONTIGは廃止されようとしているので、あなたも使用することができます。

SELECT * FROM sys.dm_db_index_physical_stats 
(DB_ID(N'DatabaseName'), OBJECT_ID(N'TableName'), NULL, NULL , 'DETAILED') 
関連する問題