1

クラスタ化インデックスについて質問があります。

クラスター化されたインデックスでは、リーフ レベルのノード自体がデータを並べ替えられた順序で保持しますよね?

つまり、挿入/更新/削除のたびに、ソートされた順序を維持するためにノードが再シャッフルされます。

では、挿入された順序でデータを取得するにはどうすればよいでしょうか。

次のデータが指定された順序で挿入され、1,7,4,5,2このフィールドにクラスター化インデックスが作成されたとします。

データは順番どおりに内部に保存され1,2,4,5,7ますよね?

これにより、特定の値のルックアップが高速化される可能性がありますが、ユーザーが挿入した順序で最初の 3 つの値が必要な場合はどうすればよいでしょうか?

それらは何らかの形で取得可能ですか、または挿入された行ごとに増分 ID を割り当て、その上で非クラスター化インデックスを宣言し、その ID フィールドでのレコードの並べ替えに基づいて最初の 3 つのレコードのデータを提供する必要がありますか?

4

3 に答える 3

2

(SQL Server に基づく回答 - 質問は 100% 指定されていません)

クラスター化されたインデックスでは、リーフ レベルのノード自体がデータを並べ替えられた順序で保持しますよね?

これは正確ではありません。データはリーフ上に任意の順序で格納できますが、ページ上のスロット配列は実際には、データがページから読み取られる順序であり、データの物理的な順序ではありません。

つまり、挿入/更新/削除のたびに、ソートされた順序を維持するためにノードが再シャッフルされます。

ノード (たとえば、ページが分割され、二重リンク リストの前方/後方ポインターが変更されます)。ただし、ページ内では、スロット配列は依然として順序を保持するエンティティであり、行自体はスロット配列の順序に一致するようにシャッフルされません。

では、挿入された順序でデータを取得するにはどうすればよいでしょうか。

通常、正確な順序になることは保証されていません。これは、スロット配列が順序をより代表するヒープページでより多く発生する傾向がありますが、保証されていません。

1、7、4、5、2 という順序でデータが挿入され、このフィールドにクラスター化インデックスが作成されるとします。つまり、データは 1、2、4、5、7 の順序で内部に保存されますよね?

いいえ、ページに 1,7,4,5,2 として格納されますが、スロット配列はページ上のアドレスを 7,5,4,2,1 として読み取ります (ページの終わりから逆方向に構築されます)。ですから、逆に読んでください。)

これにより、特定の値のルックアップが高速化される可能性がありますが、ユーザーが挿入した順序で最初の 3 つの値が必要な場合はどうなるでしょうか?

この場合は重要ではありません - 順序付けに関するそのような保証がないことを除けば、SQL はページ全体をメモリに読み込みます。この種のレベルの SQL Internals について詳しく知りたい場合は、最良の情報源の 1 つとして Kalen Delaney の SQL Internals book をお勧めします。

挿入順序に関する情報が必要な場合は、ある種の insert_timestamp をお勧めします

于 2012-07-01T19:26:43.043 に答える
1

テーブル データは、クラスター化インデックスの順序に従って並べ替えられます。彼が挿入した順序で最初の 3 つの値を確認したい場合は、各テーブルに 1 つのクラスター化インデックスしか持つことができません。

アドベンチャワークスを使う

行く

CREATE TABLE myTable99(
Col1 int IDENTITY(1,1) PRIMARY KEY , Col2 Char(1) , Col3 datetime DEFAULT getdate()

) 行く

INSERT INTO myTable99(Col2) SELECT 'A' UNION ALL SELECT 'B' UNION ALL SELECT 'C' GO

SELECT * FROM myTable99 ORDER BY 3 GO

DROP TABLE myTable99 GO

他の方法は次のとおりです。

CREATE TABLE CounterData]( [CounterDataID] [bigint] IDENTITY(1,1) NOT NULL, [DateTimeID] [bigint] NOT NULL, [Value] [float] NULL ) ON [プライマリ]

UNIQUE CLUSTERED INDEX [IX_DateTime_CounterDataID] を [PK].[CounterData] に作成します。

(

[DateTimeID] ASC、
[CounterDataID] ASC

)

(PAD_INDEX = オフ、STATISTICS_NORECOMPUTE = オフ、SORT_IN_TEMPDB = オフ、IGNORE_DUP_KEY = オフ、DROP_EXISTING = オフ、ONLINE = オフ、ALLOW_ROW_LOCKS = オン、ALLOW_PAGE_LOCKS = オン) オン [プライマリ] GO

于 2012-07-01T19:47:49.320 に答える
1

行にタイムスタンプが必要なようですね。通常、作成するすべてのテーブルに次の列を配置します (監査用)。

timecreated
timemodified
createdby
modifiedby
deleted

これらの列は、誰が行を作成したか、いつ行を最後に変更したか、誰が行を変更したかを示します。必要に応じて、deleted を true に設定して行を「ソフト削除」します。もちろん、システム内の他のすべてのクエリは、論理的な削除が機能するために削除されたブール値をチェックする必要があります。

于 2012-07-01T19:25:40.600 に答える