PostgreSQL函数插入与原始SQL插入相比性能差
我试图在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
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范围内。该恒定成本是每次调用的成本,而不管实际完成的工作有多少。