【问题标题】:Npgsql: How do Prepared StatementsNpgsql:如何准备语句
【发布时间】:2011-05-23 06:01:39
【问题描述】:

我们正在为多人游戏开发数据库后端。服务器是用 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;

并且它指出准备好的语句仅在数据库会话中有效。 我现在有两个问题:

1.) 如果我创建一个具有相同命令文本和参数类型的新 NpgsqlCommand 对象,或者我必须保留该对象并在再次执行之前简单地更改变量,服务器是否会识别该命令已准备好?在示例中,命令对象被放置在查询之后。

2.) 尽管我们只有这种风格的简单语句,但准备好的语句可能会提高性能:

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

可能连续执行数百个具有相同样式的查询 - 当前为每个查询创建一个新的 NpgsqlCommand(以及 NpgSql 池中的 NpgsqlConnection)对象。

谢谢!

【问题讨论】:

    标签: c# performance postgresql prepared-statement npgsql


    【解决方案1】:

    我建议您不要使用准备好的语句。 Npgsql 还没有很好的性能。 :( 对不起。

    另外,为了发送大量插入命令,我认为您应该查看 NpgsqlCopy 支持。它会给你更好的表现。 希望对你有帮助。

    【讨论】:

    • Copy 是用于读取/写入文件,不是吗?在这种情况下,它没有用,因为我们将所有数据都保存在内存中。但是感谢您对准备好的语句性能不佳的提示。
    • 是的。但它也用于向服务器发送大量数据。我以为这就是你想要做的。对不起,如果我误读了你的帖子。 :)
    • 接受了,因为提示准备好的语句在 Npgsql 中还没有性能
    • 不幸的是,仍然建议不要对任何语句使用 prepare ,除了那些包括 bytea 数据的语句。这些被优化以与准备好的语句一起使用。对此感到抱歉。我仍然需要为准备好的语句提高性能。
    • 看这里postgresql.org/message-id/… 似乎PreparedStatements 现在表现不错。是 2.1.0 版,Npgsql 现在是 2.2.1 版!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-08
    • 2011-06-14
    • 1970-01-01
    相关资源
    最近更新 更多