1

c/java/etcなどのポインタを使用することができるかどうか不思議です。外部キーに基づいてテーブルを結合するのではなく、このトピックでは、Postgresやその他のRDBMSは、結合するときにFKを含むテーブル全体を検索するのではなく、外部キーが参照する行をすばやく見つけるためにポインタを使用していますか?外部キーを使用するのではなく、別のテーブルの行にテーブルポインタを格納する

+0

私はよくこれを疑問に思っています。 RDBMSは、外部キー列の値と物理的な行ポインタ(PostgreSQLのctidのような)を秘密裏に格納することができ、索引を経由せずに参照行を見つけることができます。ただし、参照先の表が圧縮されるたびに更新する必要があります。また、行が大きくなるため、IOの帯域幅とキャッシュの負荷が大きくなります。正味の効果があるか?それは複雑さの増加を正当化するだろうか? –

答えて

2

データのリレーショナルモデルの本質的な特徴は、データベースの外部の論理ビューでポインタ、構造リンク、またはアドレスベースのデータアクセスを使用しないことです。実際、ポインターの使用を廃止したのは、1969年にリレーショナルモデルを発明した主な動機の1つでした。

もちろん、ほとんどのリレーショナル/ SQLベースのDBMSではポインタが内部的に使用されています。

+0

しかし、彼らはこの特定の方法で使用されていますか?どのデータベースもディスク上の参照された行へのポインタを格納していますか? –

0

Oracleには、テーブルの行の物理アドレスを格納するROWIDという名前があります。 [AAL]表領域に

  • データオブジェクトNR(セグメント)[AAAA8m]
  • データファイル
  • データブロック(データファイル内)[AAAAQk]
  • 行:彼らはに分けることができるAAAA8mAALAAAAQkAAAようになり(ブロック内)[AAA]

rowidを使用すると、物理的にシングルブロック読み出し。それらは内部的に使用されますが、開発者が直接使用することができます。主キーで行を検索すると、1つ(または少数)の索引読み込みが発生してROWIDが検索され、データベースによってブロックが検索され、行が抽出されます。 ROWIDを知っている場合、索引ルックアップは必要ありません。言い換えれば、リレーショナルデータベースの柱の1つは、モデルが物理ストレージ(ポインタなし)から独立していると考えられるということです。また、特定の実装(dbmsの)が追加機能を透過的に最適化して提供できるようにします。

あなたがROWIDを使用するたびに、Unicornが死亡し、糞が天から落ちます。たとえば、テーブルを縮小したり、パーティション化されたテーブルを更新したり(行を別のパーティションに移動させる場合)、またはテーブルを再構築する場合、またはテーブルをエクスポート/インポートする場合、または...または... ROWIDが変更されます。

結論:ROWIDベースのアクセスは、必然的に失敗するリスクがあるため、通常の索引アクセスよりも十分な利点を提供しません。彼らが存在していることと彼らが何であるかを知ってはいますが、それらに頼ることはありません。

関連する問題