2

ブール列がインデックスの検索にあまり役立たないことについて読んだことがあります..しかし、私の質問は..クラスター化されたインデックスがレコードの物理的な配置に影響を与える場合、それを使用してレコードのタイプをすべてまとめて配置することはできません(同じページで)それらのページがメモリにロードされる可能性が少なくなるように..もっとよく説明しようとします:テーブル

[BookPages]
ID(int)
Deleted(Boolean)
Text(Varchar)

クラスター化インデックスがID列にある場合、サンプル データは次のようになります。

1, true,  'the quick..'
2, false, 'hello w..'
3, true,  'stack m..'
4, false, 'just thin...'

これは、削除/アクティブなレコードがインターリーブされていることを意味するため、レコード 2 を検索すると

SELECT [Text] FROM [BookPages] WHERE [Deleted] = false AND [ID] = 2

「リーフ」データページは行 (1,2) で終わる可能性があります。これは、削除されたフィールドを持つレコードをメモリにロードしていることを意味しますDeleted,ID。データは今

2, false, 'hello w..'
4, false, 'just thin...'
1, true,  'the quick..'
3, true,  'stack m..'

ここで、SQL がページをロードするときにアクティブなレコードのみをターゲットにすると、アクティブなレコードだけでページがいっぱいになります。

したがって、長い歴史と多くの削除されたレコードを持つデータベースでは、必要なレコードの局所性を高め、IO を支援できます。

また、何千ものページで、それらの大部分がメモリにロードされることは決してなく、そのデータは常にディスクにのみ残るようにすることができます。

この推論は正しいですか?これは、大規模なデータベースの全体的なパフォーマンスに影響を与える (改善する) 可能性がありますか?

4

2 に答える 2

0

可能な値が 2 つ以下の列にインデックスを作成することは、実際には非生産的です。頻繁にクエリされる別の列のために保存したい場合があるため、ブール列をクラスター化することも賢明ではない場合があります。例、顧客名。DB サーバーが断片化をサポートしている場合、Deleted 列の値が false で、アクセスが最も少ない行を別のテーブルに論理的に配置できます。次の関連する質問/回答を参照してください。

于 2013-08-04T21:40:22.503 に答える