最近、ある同僚が、データベースを再構築する計画について説明してくれました。新しいデータベースは単純なスター スキーマに準拠します。親テーブルはキーといくつかのコンテキスト情報で構成され、そのキーは他のテーブルの外部キー フィールドとして機能します。外部キー フィールドは、同じ子テーブルに複数回表示される場合があります。
擬似コード:
TABLE Parent
INT key PRIMARY_KEY
INT foo
...
TABLE Child1
INT key FOREIGN_KEY REFERENCES Parent.key
BLOB bar
...
TABLE Child2
INT key FOREIGN_KEY REFERENCES Parent.key
VARCHAR tar
...
この設計の背後にある動機は、以前のスキーマでは複雑だった と のParent
間の JOIN を単純化することです。Child<n>
JOIN をさらに高速化するために、同僚は OUTER JOIN の使用を最小限に抑えたいと考えています。key
具体的にはParent
、JOINS を使用し、特定の方法で子テーブルのデータを維持することにより、OUTER JOIN をエミュレートしたいと考えてChild<n>
いkey
ます。それ以外の場合は s でいっぱいですnull
。このように、 と の間Parent
で実行Child<n>
される JOIN は、すべての inkey
に対して少なくとも 1 つの結果を返します。key
Parent
この方法でデータを維持することに努力する価値があるかどうかという問題はさておき、すべてのkey
フィールドに適切にインデックスが付けられ、子の行の約半分が削除されていると仮定すると、このアプローチは OUTER JOINS を実行するよりもパフォーマンスが高いnull
でしょうか?
質問は、「インデックスに存在しない値よりも、インデックスに存在する値のインデックス ルックアップを実行する方が高速ですか?」に要約されるようです。インデックスが B ツリーまたはハッシュのように機能すると仮定すると、答えは「いいえ」と思いますが、確信を持てるだけのことはわかりません。