将UDTT []传递给postgres函数

时间:2018-01-13 00:46:48

标签: sql-server postgresql performance stored-procedures npgsql

我在postgres中创建了一个函数,它将UDTT []作为导入参数,并希望最终将该数据插入表中

示例Udtt

create type udtt_mytype as 
(
  id uuid,
  payload int
);

然后一个示例函数类似于

CREATE OR REPLACE FUNCTION dbo.p_dothething(p_import udtt_mytype[])
RETURNS void
LANGUAGE plpgsql
AS $function$
BEGIN
insert into mytab select * from unnest($1)
RETURN;
END
$function$;

我的C#后端目前看起来像

public class udtt_mytype
{
    [PgName("id")]
    public Guid id{ get; set; }
    [PgName("payload ")]
    public int payload  { get; set; }
}
var payload = CreateAndFillUdttMyType();
var conn = new NpgsqlConnection();
conn.Open();
var transaction = conn.BeginTransaction();
conn.MapComposite<udtt_mytype>("udtt_mytype");

var command = new NpgsqlCommand("dbo.p_dothething", conn);
command.CommandType = CommandType.StoredProcedure;
Object[] objArray = new Object[1];
objArray[0] = new NpgsqlParameter { ParameterName = "p_import", 
    Value = payload , NpgsqlDbType = NpgsqlTypes.NpgsqlDbType.Array | 
    NpgsqlTypes.NpgsqlDbType.Composite };
command.Parameters.AddRange(objArray);

var result = command.ExecuteScalar();
transaction.Commit();
conn.Close();

虽然上述方法有效,但与类似的UDTT相比,它非常不具备效果 - &gt; SQL StoredProcedure。在我们的NPGSQL实现之前,这是<1秒,但现在我似乎看到每6k行大约6秒(而最常见的用途是这个数字要高得多)。

使用一些时间戳并从SP返回,我看到函数中的数据处理根本不是问题..它似乎完全是有效载荷的传输时间。在这种特殊情况下,它是一个简单的UDTT_MYTYPE数组,并且只有一个对象,执行是瞬时的,但是w / 6k,它可以达到6-7秒的范围。即使我将它传递给一个空函数(删除了不需要/插入的成本),这种性能仍​​然存在。

实际上,udtt_mytype有12列各种类型,但我们仍然在谈论一个相对“浅”的对象。

我试图将此与NPGSqls关于批量复制的文档(此处为http://www.npgsql.org/doc/copy.html)进行比较,并且该实现似乎比这更慢,这似乎是矛盾的。

postgres通常比MSSQL慢得多,还是有些东西可能会限制我不知道的数据速率?显然,没有人可以代表我的网络连接/硬件设置,但任何可能在两者之间进行转换的人都是在同样的规模上看到的性能提升?

0 个答案:

没有答案