2

MSDN Web サイトで提供されている情報を使用して、インデックス サイズを推定しようとしています。

3 つの列を含むテーブル "Table1" を考えてみましょう。列は以下にリストされています。

  1. ID int、null 以外
  2. マーク int、null 以外
  3. SubmitDate 日付、null 以外

最初に、Id 列にクラスター化された主キーを作成し、次に「Id」「インデックス キー列」として非クラスター化インデックスを作成することを計画しました。ここで、「Marks」列と「SubmitDate」列は「含まれる列」として使用されます。インデックスに「 .

上記の計画に基づいて、作成する前に非クラスター化インデックス キーのサイズを見積もろうとしました。MSDN サイトを調べていると、明確にすべき混乱がたくさんあります。非クラスター化インデックス キーのサイズを見積もるには 4 つの手順があり、最初の手順では、1.2 と 1.3で、Num_Key_Cols、Fixed_Key_Size、Num_Variable_Key_Cols、および Max_Var_Key_Size の計算方法について説明します。しかし、1.2 と 1.3 では、インデックス キーの種類に基づいて計算する必要があります。クラスター化されたインデックス キーが既にあるかどうか、および列が含まれているかどうかです。紛らわしいようです。サンプル テーブル (Table1) と作成したい非クラスター化インデックス キー構造について提供した情報に基づいて、誰か助けてくれませんか。

私の場合、列を含めました.インデックスキー列はすでに主キーであり、すべての列はnullフィールドではありません. そのインデックスサイズを計算する方法は?

前もって感謝します。

4

2 に答える 2

3

最初に、Id 列にクラスター化された主キーを作成し、次に「Id」を「インデックス キー列」として非クラスター化インデックスを作成することを計画しました。ここで、「Marks」および「SubmitDate」列は「含まれる列」として使用されます。インデックスに「.

私はこれをしません。Id主キー (つまり一意) とテーブルのクラスタリング キー (3 列のみ) の両方を作成することにより、さらに NC インデックスを追加する意味がほとんどIdなくなります。クラスタ化インデックスで十分です。

テーブルに多数の (ページ上の) 列がある場合は、NC インデックスの密度が高くなるため、Id含まれている列をオンにして別の NC インデックスを追加する理由がある可能性があります。(Marks, SubmitDate)しかし、ここでは明らかにそうではありません。

MSDN NC サイジング リンクの明確化:

  • 直接索引列は、ツリーのすべてのレベルで考慮する必要があります。
  • INCLUDE列はツリーのリーフ ノードにのみ存在します
  • Num_Key_Cols = Num_Key_Cols + 1クラスタリング キーが一意でない場合に、Sql Server が 4 バイトの一意識別子を追加する場合にのみ必要です。主キーでクラスター化したため、一意であり、+1 ではありません。

実際のデータに対して経験的な測定を行うことも忘れないでください

すべてのテーブルとインデックスの列幅が固定されているわけではありません。多くは のような可変長のインデックス列を持っています(N)VARCHAR。この場合、テーブルとインデックスによって消費される実際のストレージは、そのようなフィールドの平均長に大きく依存します。

この場合、テーブルを作成しておおよそのデータを入力し、sp_spaceusedや などのツールを使用して実際のデータ ストレージを測定することをお勧めします。次にsys.dm_db_index_physical_stats例を示します。

select * from sys.dm_db_index_physical_stats (DB_ID(), 
           OBJECT_ID(N'dbo.Table1'), NULL, NULL , 'DETAILED');

(ページサイズは8192)

編集

説明のために、すでにこれが整っている場合:

CREATE TABLE Table1
(
    Id INT IDENTITY(1,1),
    Marks INT NOT NULL,
    SubmitDate DATE NOT NULL
);

ALTER TABLE Table1 ADD CONSTRAINT PK_Table1 PRIMARY KEY CLUSTERED (Id);

次に、これも同様に行う意味はありません。

CREATE NONCLUSTERED INDEX IX_Table1 on Table1(Id) INCLUDE (Marks, SubmitDate)

クラスタ化されたインデックスは、NC インデックスと同じくらい効率的にシーク/スキャンするためID、必要なストレージは 2 倍になります。

余談ですが、一般に、クラスター化インデックス キーはすべての非クラスター化インデックスに自動的に含まれ、非クラスター化インデックスに明示的に追加する必要がないことにも注意してください。

于 2015-03-28T13:51:18.370 に答える
0
SELECT
OBJECT_NAME(i.OBJECT_ID) AS TableName,
i.name AS IndexName,
i.index_id AS IndexID,
8 * SUM(a.used_pages) AS 'Indexsize(KB)'
FROM sys.indexes AS i
JOIN sys.partitions AS p ON p.OBJECT_ID = i.OBJECT_ID AND p.index_id = i.index_id
JOIN sys.allocation_units AS a ON a.container_id = p.partition_id
GROUP BY i.OBJECT_ID,i.index_id,i.name
ORDER BY OBJECT_NAME(i.OBJECT_ID),i.index_id
于 2015-03-28T13:42:44.660 に答える