質問

まっすぐな行とテーブルのサイズを見積もるのは非常に簡単な計算ですが、各インデックスが(特定のテーブルサイズに対して)どれだけのスペースを占有するかを推測することは困難です。インデックスのより良い推定値と成長率を計算するために、どの分野を学ぶことができますか?

役に立ちましたか?

解決

インデックスリーフには、データページを識別するプリアンブル(7バイトと、可変長列のディレクトリ情報(ある場合))と、それらのテーブルデータと同じサイズのキー値のコピーがあります列。テーブルの各行に1つあります。インデックスの上位レベルは非常に小さく、通常、非常に幅の広いキーにインデックスを付ける場合を除き、リーフの1%未満です。

フィルファクタにより、空き領域がいくらか残されるため、更新および挿入によって過剰なリーフ分割トラフィックが生成されません。

編集:このMSDNリンクはページレベルの構造を説明し、ただし、個々のインデックス行の形式については少しわかりにくいです。 このプレゼンテーションディスクログエントリとデータページの物理フォーマットにある程度。 これの詳細とインデックスを含むデータ構造。数値列と固定長列のサイズは、ボックスに記載されています。 varchar列の平均サイズを推定する必要があります。

参照用に、Oracleのブロック形式に関するドキュメントの一部をこちらおよびここ

他のヒント

可能な場合、通常は元のテーブルから1000レコードを取得しますが、 それらを自分のテーブルに挿入し、 以下のスクリプトを使用して、再生するサンプルを用意しています。

それは正確ではありませんが、出発点を与えることができます。

--Find out the disk size of an index:
--USE [DB NAME HERE]
go
SELECT
OBJECT_NAME(I.OBJECT_ID) AS TableName,
I.name AS IndexName,   
8 * SUM(AU.used_pages) AS 'Index size (KB)',
CAST(8 * SUM(AU.used_pages) / 1024.0 AS DECIMAL(18,2)) AS 'Index size (MB)'
FROM
sys.indexes I
JOIN sys.partitions P ON P.OBJECT_ID = I.OBJECT_ID AND P.index_id = I.index_id
JOIN sys.allocation_units AU ON AU.container_id = P.partition_id
--WHERE 
--    OBJECT_NAME(I.OBJECT_ID) = '<TableName>'    
GROUP BY
I.OBJECT_ID,    
I.name
ORDER BY
TableName

--========================================================================================

--http://msdn.microsoft.com/en-us/library/fooec9de780-68fd-4551-b70b-2d3ab3709b3e.aspx

--I believe that keeping the GROUP BY 
--is the best option in this case
--because of sys.allocation_units
--can have 4 types of data inside
--as below:

--type tinyint
--Type of allocation unit.
--0 = Dropped
--1 = In-row data (all data types, except LOB data types)
--2 = Large object (LOB) data (text, ntext, image, xml, large value types, and CLR     user-defined types)
--3 = Row-overflow data

--marcelo miorelli 8-NOV-2013
--========================================================================================
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top