2012-02-24 8 views
0

データベースにテーブル内のデータを格納する順序は、主キーが存在しない場合はランダムです。私の質問は基本的には、クエリの後にデータが変更されたときに何が起こっているのですか?データベースを開いて閉じた後、もう一度開いて別の順序でデータを検索すると、そのときに何が起こっていますか?主キーのないデータベーステーブル

答えて

1

実現についての質問 - それはあなたが使用しているDBMSによって異なります。

最も単純な答え - このテーブルのデータはDBMSキャッシュから削除され、明示的なORDER BY演算子で指定されていない場合は、ディスクから任意の順序で読み込まれます。

存在しない主キーの主な問題 - データの一貫性の欠如。テーブルが主キーを持たない唯一の理由 - テーブルがステージング(バッファ)テーブルの場合。

1

プログラムキーを実装することができます。プログラミングロジックを使用してデータを管理します。決してこれは良い習慣ではありません。 さらに、プライマリキーのないデータはDBMSによって適切に管理できません。データの一貫性が損なわれる可能性があります。また、妥協する可能性があります。

+0

私はそれが貧しい練習であると知っています。私は決してそれをしません。しかし、誰かが私に尋ねたのは、先日、データが変更され、私は知らなかったのです。 – wootscootinboogie

+1

まあ、主キーは別の部分を一緒にリンクします。あなたのテーブルのお菓子の束としてそれについて考えると、このもののいくつかは文字列に接続されています。チェーンが接続されているのでチェーン全体を引き出すことができます。しかし、文字列をカットし、物事は失われます。これが、PKのデータ保全性を維持するための重要な役割です。 – Andrew

3

多くの関連概念が混乱していると思います。

主キーは概念的なものです。これは、リレーショナルデータベースのレコードの一意の識別子です。

主キーは、しばしば一意のインデックスによって実装されます。いくつかのデータベースシステムでは、これらを "クラスタ化された"ものとして指定できます。これらはディスク上のデータの物理的順序付けに影響します。

データが返される順序は、最初に "order by"句で制御されます。それが利用できない場合、それは定義されていません - それぞれのデータベースは自由にこれを実装することができます。

実際には、「ディスクに格納されている順に」という意味です。クラスタード・インデックスがある場合、その順序になります。存在しない場合は、クエリキャッシュにあるものであっても、レコードがディスクに格納されているものであってもかまいません。

+0

"クエリキャッシュには何でもかまいません"これが私の目的です。これを決定する要因は何ですか? – wootscootinboogie

2

ORDER BYを使用して注文していないのであれば、データベースは基本的には最も便利な順序で返品することは基本的に自由です。

注文できる方法の例。

  • 結果の順番の行が挿入されました。これは、毎回同じ順序で行を返す可能性が最も高いでしょう。
  • インデックスに表示される順に結果を返します。データベースはいつでもインデックスを再構築できるため、特にINSERT/UPDATE/DELETEの後に、同じ順序で表示されるとは限りません。
  • キャッシュされた結果を最初に戻し、結果をディスクから読み込む必要があります。これにより、クエリの最初の結果がすぐに表示されますが、クエリを実行するたびに結果が完全に予測できない順序で表示されます。

つまり、明示的に要求しない限り、注文を信頼しないでください。データベースは、あなたの利益のために最適化することであなたを驚かせるかもしれません。

これはORDER BYを使用しない限り、オーダーに影響を与えないprimary keyとは基本的に関係がありません。これは、別のテーブルから結果を参照する便利で変化のない方法です。

+0

すべての良い回答と私が探していたもの。グラシア、アミーゴ! – wootscootinboogie

3

私は、データベースがテーブルにデータを格納する順序は、プライマリキーが存在しない場合はランダムです。

実際、この仮定は無効です。主キーを宣言しても、データベースはディスク内の特定の順序でデータをレイアウトする必要はありません。唯一のことは、データベースにが重複するキーを持つ行がないことを保証することです。

ここで、データベースによってどのように保証されますか?短い答えはで、どのような方法でもになります。それが動作する限り、データベース実装者は自由に何かを選ぶことができます。最も一般的なメカニズムは一意インデックスを作成し、一意性を保証するために使用します。インデックスは順序付けられていますが、テーブルは順序付けられていません。

しかし、RDBMSは同じことをするための代替戦略を提供することがよくあります。たとえば、索引構成表(Oracleで使用可能なオプション機能)は、表自体を順序付けしておく戦略に従います。これには、デフォルトの戦略(いくつかの種類のクエリではより良いパフォーマンスを促進するが、より多くのディスク領域を使用する)と比較していくつかの利点と欠点があります。

これはデータベースシステムの要点です。データのスキーマを高レベルの用語(テーブル、キー、制約)で定義し、RDBMSがデータの構成方法を決定します。 RDBMSには、データベースシステムを設計し実装する賢い人たちが、同じことをより新しい方法で実現するために、RDBMSにどのように自由を与えるかという自由が与えられています。

私の質問は基本的に、クエリの後にデータが変更されたときに起こっていることですか?データベースを開いて閉じた後、もう一度開いて別の順序でデータを検索すると、そのときに何が起こっていますか?

さてあなたは(ORDER BY付き)特定の順序で使用すると、クエリ結果をデータベースを指示しない限り、すべての最初の、それが好きな任意の順序で結果を返すことが許可されています。

最も一般的な理由は、データベースが異なる実行計画を選択しており、これらの計画が同じテーブルで異なるインデックスを使用しているためです。インデックスが異なると注文が異なるため、インデックスの選択肢が異なると結果の順序が異なります。

ただし、その他の理由が考えられます。たとえば、一部のデータベースでは、異なるクエリを並列に実行する場合があります。この場合、最初に使用できる行はあらかじめ決められていません。重要なことは、行が生成されなければならない事前定義された順序がないという事実により、データベース実装者は、最速と思われるものに基づいて代替戦略を選択することができるということです。

+0

"最も一般的なメカニズムは一意のインデックスを作成し、一意性を保証するために使用します;インデックスは順序付けられていますが、テーブルはありません。それは私の誤解の良い総和と説明です。ありがとう! – wootscootinboogie

2

「しかし、誰かがデータの順序が変わったのは私には分かっていましたが、私は知らなかった」

「固有の」順序付けがないことは、リレーショナル・モデルの最も基本的な特性の1つです。集合{1 2}は集合{2 1}と全く同じ集合であり、関係モデルは集合理論に由来する。