私はすべてのユーザーに2 MBのデータベース領域が割り当てられているシナリオを持っています。 これで、割り当てられたスペースのPercenatgeの使用状況を表示する必要があります。そのため、テーブルの単一レコードのサイズを知る必要があります。1つのレコードのサイズ? SQL
私はsp_spaceusedを使用しようとしており、datalength ..を使用してカスタムプロシージャを書きましたが、それらの結果には大きな違いがあります。
この問題を回避する方法はありますか。
私はすべてのユーザーに2 MBのデータベース領域が割り当てられているシナリオを持っています。 これで、割り当てられたスペースのPercenatgeの使用状況を表示する必要があります。そのため、テーブルの単一レコードのサイズを知る必要があります。1つのレコードのサイズ? SQL
私はsp_spaceusedを使用しようとしており、datalength ..を使用してカスタムプロシージャを書きましたが、それらの結果には大きな違いがあります。
この問題を回避する方法はありますか。
データは、データベースの名前のディレクトリにディスクに保存されます。それには、測定していないもの(指標など)を含むすべてが含まれます。それを測定する。
これらのヒントを測定する方法は役に立ちます –
かなり複雑な数式を使用して行(行数の)サイズを計算することができます。詳細については、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
優れた書籍オンラインリンク、ありがとうございます。 – DenNukem
あなたが言及したサイズの単位は何ですか?KBまたはB – semirturgay
https://msdn.microsoft.com/en-us/library/ms175008.aspx - これを見ると、Bytes – JsonStatham
FYIこの機能は新しい開発作業では使用せず、できるだけ早くこの機能を現在使用しているアプリケーションを変更してください。代わりにsys.dm_db_index_physical_statsを使用してください。 – DaveD
データベースのオブジェクトによって割り当てられたページ数を調べることで、データによって使用されている@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%正確です。さらに、エクステントには空きページ(予約されているためにディスクスペースを占有することさえあります)がある場合もありますので、一般的にこの見積もりは常に低くなります。しかし、おそらく、ページレベルでデータベースを検査する何かを書かずに取得するのが最善でしょう。
ああ、他の回答を見ると、これは別のオプションです。これは、基本的に、ページ内のデータファイルの現在のサイズをすべて調べ、消費したスペースの割合を決定します。今、ここにも警告があります...
これらのいずれかが問題を解決します。
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
願い私はあなたのために複数回投票することができました。 :-) –
SHOWCONTIGは廃止されようとしているので、あなたも使用することができます。
SELECT * FROM sys.dm_db_index_physical_stats
(DB_ID(N'DatabaseName'), OBJECT_ID(N'TableName'), NULL, NULL , 'DETAILED')
のために使用されるこの「スペース」とは何ですか? –
どのようにユーザーデータを分割していますか?それはすべて同じテーブルにありますか?または、各ユーザーは独自のテーブルを持っていますか? –
私はすべてのユーザーデータが保存される1つのテーブルを持っています。 UserIdは個々のユーザーデータを区別するために使用されます –