SQL Serverのインデックスサイズを推定する方法
-
05-07-2019 - |
質問
まっすぐな行とテーブルのサイズを見積もるのは非常に簡単な計算ですが、各インデックスが(特定のテーブルサイズに対して)どれだけのスペースを占有するかを推測することは困難です。インデックスのより良い推定値と成長率を計算するために、どの分野を学ぶことができますか?
解決
インデックスリーフには、データページを識別するプリアンブル(7バイトと、可変長列のディレクトリ情報(ある場合))と、それらのテーブルデータと同じサイズのキー値のコピーがあります列。テーブルの各行に1つあります。インデックスの上位レベルは非常に小さく、通常、非常に幅の広いキーにインデックスを付ける場合を除き、リーフの1%未満です。
フィルファクタにより、空き領域がいくらか残されるため、更新および挿入によって過剰なリーフ分割トラフィックが生成されません。
編集:このMSDNリンクはページレベルの構造を説明し、ただし、個々のインデックス行の形式については少しわかりにくいです。 このプレゼンテーションディスクログエントリとデータページの物理フォーマットにある程度。 これの詳細とインデックスを含むデータ構造。数値列と固定長列のサイズは、ボックスに記載されています。 varchar列の平均サイズを推定する必要があります。
他のヒント
可能な場合、通常は元のテーブルから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
--========================================================================================
所属していません StackOverflow