Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PostgreSQL函数插入与原始SQL插入相比性能差_Sql_Postgresql_Database Performance - Fatal编程技术网

PostgreSQL函数插入与原始SQL插入相比性能差

PostgreSQL函数插入与原始SQL插入相比性能差,sql,postgresql,database-performance,Sql,Postgresql,Database Performance,我试图在PostgreSQL中创建一个函数来插入数据。我的请求非常简单,当我在函数外部执行SQL请求时,我有很好的性能,但当它在函数内部时,性能很差 当我这样做时: EXPLAIN ANALYZE INSERT INTO car (name) VALUES ('test') RETURNING *; 我有很好的性能(执行时间:0.054毫秒),这很正常,只是一个简单的插入请求 但如果我转到这样创建的函数: CREATE OR REPLACE FUNCTION createCar(_name t

我试图在PostgreSQL中创建一个函数来插入数据。我的请求非常简单,当我在函数外部执行SQL请求时,我有很好的性能,但当它在函数内部时,性能很差

当我这样做时:

EXPLAIN ANALYZE INSERT INTO car (name) VALUES ('test') RETURNING *;
我有很好的性能(执行时间:0.054毫秒),这很正常,只是一个简单的插入请求

但如果我转到这样创建的函数:

CREATE OR REPLACE FUNCTION createCar(_name text) 
RETURNS SETOF car AS $$
    INSERT INTO car (name) VALUES (_name) RETURNING *;
$$ LANGUAGE sql;
我执行如下函数:

EXPLAIN ANALYZE SELECT * FROM createCar('test');
而且性能非常糟糕(比如慢10倍,~执行时间:1.126毫秒)。这只是一个简单的插入

对于一个简单的选择函数,移动到一个“稳定”函数解决了这个问题,但是对于一个插入,我可以处于“易失性”模式,因为我正在修改数据库


我可能做错了什么,谢谢你的帮助

这不是答案,而是需要考虑的一些方面:简单的insert包含在函数中,需要构建和填充可从pl/pgsql访问的数据结构,因此需要一些开销。此外,只要不使用它并且表上没有更新,就不需要具体化sql插入的结果集。严格地说,这也适用于函数,但最肯定的是,语言实现不支持对返回参数的延迟求值(尽管这只是有根据的猜测),我在这里找到了一个有趣的解释:函数开销,是的。我们实际上应该定义什么是“可怕的”。20倍的速度并不是现在的情况。编组的成本是恒定的,可能在1ms范围内。该恒定成本是每次调用的成本,而不管实际完成的工作有多少。