2

私は最近データベースに取り組んでおり、それ以前はデータベースを使用しないスタンドアロン コンポーネントを開発していました。すべての DB 作業で、いくつかの疑問が生じました。プログラミング言語によるファイルからのデータ取得よりも、データベース クエリの方が高速なのはなぜですか。

私の質問をさらに詳しく説明するには-

Name、ID、DOB、Email、Sex のフィールドを持つ Employee というテーブルがあるとします。簡単にするために、これらはすべて固定長の文字列であり、インデックスや主キー、その他の制約はないと仮定します。

テーブルに 100 万行のデータがあるとします。最終的に、このテーブルはディスクのどこかに保存されます。Select Name,ID from Employee where DOB="12/12/1985" というクエリを作成すると、DBMS はファイルからデータを取得して処理し、フィルタリングして、100 万のサブセットである結果を返します。データの行。

ここで、同じ 100 万行をフラット ファイルに格納するとします。各フィールドは、簡単にするために同様に固定長の文字列です。データは、ディスク内のファイルで利用できます。C++、C、C#、または Java でプログラムを作成し、DOB="12/12/1985" の名前と ID を検索する同じタスクを実行すると、ファイル レコードをレコードごとに読み取り、データの各行をチェックします。 DOB="12/12/1985" の場合、一致する場合は、ユーザーに行を提示します。

プログラムによるこの方法は、SQL クエリが結果を返す速度と比較すると遅すぎます。

DBMS も何らかのプログラミング言語で記述されており、クエリの解析などの追加のオーバーヘッドもあると思います。

では、プログラミング言語よりも高速にデータを取得できる DBMS ではどうなるでしょうか?

この質問がこのフォーラムで不適切である場合は、削除してください。ただし、回答が見つかる可能性のあるヒントをいくつか教えてください。

それが助けになるなら、私はSQL Serverを使用します。

4

3 に答える 3

7

データベースクエリは、ファイルからのプログラミング言語データ取得よりも速いのはなぜですか

これは多くの要因に依存します。ネットワークの遅延とディスクのシーク速度は、重要なものの 2 つです。ファイルから読み取る方が速い場合もあります。

百万行の中から行を見つけるという説明では、データベースは通常、データのインデックス作成を採用しているため、ファイルをシークするよりも高速です。

データ ファイルとさまざまなフィールドの提供されたインデックス ファイルを前処理すると、ファイルシステムからのデータ検索も高速化できます。

注: データベースは通常、この機能のために使用されるのではなく、ACID に準拠しているため、複数のプロセス (通常は多くのコンピューター上の多くのクライアント) が同時にデータベースにクエリを実行する環境での作業に適しているためです。

于 2012-04-05T16:00:19.040 に答える
0

さまざまな種類のアクセスを高速化するためのテクニックがたくさんあります。@Oded が言うように、インデックス作成は特定の例に対する大きな解決策です。データベースが日付ごとにインデックスを維持するように設定されている場合、ファイル全体を読み取るのではなく、その日付のエントリに直接移動できます。(ただし、インデックスの維持にはスペースと時間がかかることに注意してください。無料ではありません!)

一方、そのようなインデックスが設定されておらず、データベースが日付順に格納されていない場合、日付によるクエリは、フラット ファイル プログラムと同様に、データベース全体を処理する必要があります

もちろん、独自のプログラムを作成してファイルの日付インデックスを維持および使用することもできます。これにより、データベースと同様に日付クエリが高速化されます。また、他の種類のクエリを高速化するために、他のインデックスを追加したり、必要以上のリソースを使用することが判明したインデックスを削除したりする場合があります。

最終的に、ファイル マネージャーに追加したすべての機能を管理することは、複雑な作業になる可能性があります。この種の構成は、プログラムにハードコーディングするのではなく、独自のファイルに保存することをお勧めします。少なくとも、構成を変更してもファイルが破損しないようにするための機能が必要です...

つまり、独自のデータベースを作成したことになります。

于 2012-04-05T17:52:27.357 に答える
0

...古いもの、私は知っています...誰かがこれを見つけた場合のためだけに:質問には「仮定...インデックスがない」が含まれていました

...したがって、質問は、データベースとインデックスなしのフラットファイルとの間のシーケンシャルデータ読み取りの戦いについてであり、データベースが勝ちます...

答えは次のとおりです。ディスクからレコードごとに読み取る場合、多くのディスク シークを行うことになり、パフォーマンスが高くなります。データベースは常に概念ごとにページをロードするため、一度にいくつかのレコードが読み込まれます。ディスクシークが少ないほど、明らかに高速です。フラット ファイルから mem バッファリング読み取りを実行すると、同等またはそれ以上の読み取り値が得られます。

于 2014-09-10T15:17:34.450 に答える