理論的には、データベース サーバーが単純な SQL ステートメント (またはバッチ) を受け取ると、それをコンパイルする必要があります。それを何らかの内部形式に解析し、いわゆる「クエリ プラン」を準備します。これは一連の操作 (インデックスやテーブルなど)スキャン、比較など) 実際の要求を実行します。これらすべてを実行すると、特定のサーバー リソースが明らかに消費されます。非常に多くの DBMS が「準備されたステートメント」をサポートし始めました。サーバーは解析/計画ステップを 1 回だけ実行し、結果に「ハンドル」を渡します。その後、複数回「呼び出し」、異なるパラメーターを指定するだけです。
では、より複雑な領域に移りましょう。
最初に注意すべきことは、メモリと処理能力が安くなったとき、コモディティ サーバーからハイエンド サーバーで実行されている DBMS は、クエリを処理する際により多くのリソースを使用できるようになったため、一部のDBMS はユーザー クエリをキャッシュすることです。つまり、単純なクエリ (SQL ステートメントまたはバッチ) を実行すると、サーバーは通常の解析/クエリ計画をすべて実行しますが、結果を保存し、後で同じクエリに遭遇した場合は、処理部分をスキップして実行するだけです。データに対する操作。
2 番目に注意すべきことは、プログラミング言語/ライブラリは、データベース エンジンにアクセスするための特定の共通インターフェイス (ODBC forC
は一例であり、database/sql
forGo
は別の例であり、他にも無数にある) をプログラマーに提示する傾向がある一方で、ワイヤ プロトコルまたはその他のサーバーへの実際のアクセス方法は大幅に異なる場合があります。たとえば、あるデータベース サーバーはワイヤ プロトコルでクエリと共にパラメータを渡すことをサポートしている場合がありますが、別のデータベース サーバーはサポートしていない場合があるため、アクセス レイヤーはパラメータをエスケープされた SQL リテラルに変換し、それらをクエリに埋め込んでサーバーに送信する必要があります。 .
これらすべてから取得する必要がある主なアイデアは、データベースエンジンが異なり、プログラムによってデータベースに集中的な負荷をかけることを計画している場合は、データベースエンジンの詳細を知る必要があることです. DMBS のワイヤ プロトコルでできることとできないこと、DBMS の接続確立が速いかどうかなどを確認します。特定の DBMS のパフォーマンスの最適化に関するドキュメントを探してください。
さまざまな DBMS に関する議論については、thisおよびthisも参照してください。