1

マルチプレイヤー ゲーム用のデータベース バックエンドを開発しています。サーバーは C# で書かれており、Npgsql を介して Postgres データベースと通信します。

現在、マニュアルは準備されたステートメントの使用方法を示しています。

NpgsqlCommand command = new NpgsqlCommand("select * from tablea where column1 = :column1", conn);
// Now add the parameter to the parameter collection of the command specifying its type.
command.Parameters.Add(new NpgsqlParameter("column1", NpgsqlDbType.Integer);
// Now, prepare the statement.
command.Prepare();
// Now, add a value to it and later execute the command as usual.
command.Parameters[0].Value = 4;

また、準備済みステートメントはデータベース セッション内でのみ有効であると述べています。2 つの質問があります。

1.) 同じコマンド テキストとパラメーター タイプで新しい NpgsqlCommand オブジェクトを作成した場合、サーバーはこのコマンドが準備されたことを認識しますか、それともオブジェクトを保持し、再度実行する前に単に変数を変更する必要がありますか? この例では、コマンド オブジェクトはクエリの後に配置されます。

2.) このスタイルの単純なステートメントしかありませんが、準備されたステートメントはおそらくパフォーマンスを向上させます:

SELECT f1,f2 FROM t1
UPDATE t1 SET f1=1, f2=2

同じスタイルの何百ものクエリが連続して実行される可能性があります。現在、クエリごとに新しい NpgsqlCommand (および NpgSql のプールからの NpgsqlConnection) オブジェクトを作成しています。

ありがとう!

4

1 に答える 1

1

準備済みステートメントを使用しないことをお勧めします。Npgsql のパフォーマンスはまだあまり良くありません。:( そのために残念。

また、多くの挿入コマンドを送信するには、NpgsqlCopy サポートを確認する必要があると思います。これにより、はるかに優れたパフォーマンスが得られます。お役に立てば幸いです。

于 2010-12-13T20:44:16.277 に答える