データベース/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 サイトの他の関連記事を参照してください。