ホームページ  >  記事  >  バックエンド開発  >  Go の「database/sql」は、PostgreSQL の直接クエリよりもはるかに遅いのはなぜですか?

Go の「database/sql」は、PostgreSQL の直接クエリよりもはるかに遅いのはなぜですか?

DDD
DDDオリジナル
2024-11-18 02:52:02746ブラウズ

Why is `database/sql` in Go so much slower than direct PostgreSQL queries?

データベース/SQL クエリと直接データベース クエリの間のクエリ実行時間の不一致

Go アプリケーションでは、大幅な時間差が観察されていますpsql 経由で PostgreSQL データベースに直接クエリを実行する場合と、database/sql パッケージを使用する場合の比較です。同じクエリを実行すると、database/sql は約 24 ミリ秒かかるのに対し、psql はわずか 1 ミリ秒でクエリを処理することに気づきました。

違いを理解する:

不一致は 2 つの主な要因に起因すると考えられます:

1。データベース接続の作成と管理:

  • psql: psql を使用してクエリを直接実行すると、データベースへの単一のアクティブな接続が確立され、開いたままになります。
  • database/sql: 対照的に、 database/sql は、データベースへの複数の接続を管理する接続プールを利用します。最初は、プール内にアクティブな接続はありません。データベース/SQL を使用してクエリが実行されると、プールは新しい接続を確立します。

2.準備済みステートメントの実行:

  • psql: psql 経由でクエリを実行する場合、通常はパラメーターのない「単純なクエリ」になります。
  • database/sql: デフォルトでは、database/sql は準備されたステートメントを使用します。クエリにはパラメータがありませんが、クエリで $1 を使用すると、データベース/SQL が準備されたステートメントを作成して実行します。

クエリ パフォーマンスの最適化:

時間差を最小限に抑えるには、次の最適化を検討してください。

1.接続プールを初期化します:

  • データベース/SQL 接続を初期化した直後に db.Ping() メソッドを使用して、プール内で少なくとも 1 つの接続が開いていることを確認します。これにより、最初の接続確立の待ち時間が短縮されます。

2.接続の解放:

  • db.Query を使用してクエリを実行した後、rows.Close() メソッドを呼び出して、接続を解放してプールに戻します。これを怠ると接続が開いたままになり、リソース リークの可能性が生じます。

3.可能な場合は単純なクエリを使用します:

  • クエリにパラメータ化が必要ない場合は、db.Query で文字列として直接指定します。これにより、プリペアド ステートメントの作成と実行のオーバーヘッドが回避されます。

これらの最適化を実装すると、database/sql を使用したクエリの実行時間が大幅に短縮され、直接データベース クエリのパフォーマンスに近づくはずです。

以上がGo の「database/sql」は、PostgreSQL の直接クエリよりもはるかに遅いのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。