database/sql を使用したクエリは、データベースを直接クエリするよりも大幅に遅い
同一のクエリを使用しているにもかかわらず、 Postgres の psql ユーティリティを使用し、Go でデータベース/sql パッケージを使用して直接クエリを実行する 応用。 psql ではミリ秒かかるクエリが Go では数十ミリ秒かかるこの矛盾は、実装における特定の要因に起因する可能性があります。
データベース/SQL 接続について
Database/sql は、単一の接続を作成するのではなく、データベースへの接続を確立するための接続プールを初期化します。データベース/SQL でのクエリ実行の最初の遅延は、プールが開いている接続がゼロの状態から始まるためです。最初のクエリは、SQL ステートメントを実行する前にサーバーへの接続を確立する必要があります。
最初のクエリからの接続がプールに解放されていないため、後続のクエリでも遅延が発生します。これは、後続の各クエリでは、クエリを実行する前に新しい接続を作成する必要があることを意味します。
接続をプールに戻す
パフォーマンスの不一致を解決するには、接続が各クエリの後にプールに解放されます。接続の解放には、db.Query のプライマリ戻り値を保持し、その後その戻り値に対して Close メソッドを呼び出すことが含まれます。
オープン接続によるプールの初期化
初期遅延。初期化直後に接続プールで Ping を呼び出します。これにより、プール内で少なくとも 1 つの接続が使用可能になります。
プリペアド ステートメント
引数のない単純なクエリは期待どおりに実行されますが、データベース/SQL で引数を使用したクエリは、実際に内部で準備済みステートメントを作成して実行します。プリペアド ステートメントは、異なる引数を使用して同じクエリを複数回実行する場合にパフォーマンス上の利点をもたらします。
追加のレイテンシへの対処
接続管理とプリペアド ステートメントの他に、追加のレイテンシ要因が存在する場合があります。考慮すべき事項:
これらの要因に対処し、提供された推奨事項を実装することで、データベース/SQL を使用したクエリのパフォーマンスが大幅に向上し、以前と同等になります。データベースに直接クエリを実行します。
以上がGo データベース/SQL クエリが直接 Postgres psql クエリよりも大幅に遅いのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。