为什么PostgreSQL在函数中以不同的方式处理我的查询?
我有一个非常简单的查询,它并不复杂:
select * from table_name where id = 1234 …运行时间不到50毫秒. 接受该查询并将其放入函数中: CREATE OR REPLACE FUNCTION pie(id_param integer) RETURNS SETOF record AS $BODY$ BEGIN RETURN QUERY SELECT * FROM table_name where id = id_param; END $BODY$ LANGUAGE plpgsql STABLE; 执行此功能时从pie(123)中选择*;需要22秒. 如果我硬编码整数代替id_param,则该函数在50毫秒内执行. 为什么我在where语句中使用参数会导致我的函数运行缓慢? 编辑以添加具体示例: CREATE TYPE test_type AS (gid integer,geocode character varying(9)) CREATE OR REPLACE FUNCTION geocode_route_by_geocode(geocode_param character) RETURNS SETOF test_type AS $BODY$ BEGIN RETURN QUERY EXECUTE 'SELECT gs.geo_shape_id AS gid,gs.geocode FROM geo_shapes gs WHERE geocode = $1 AND geo_type = 1 GROUP BY geography,gid,geocode' USING geocode_param; END; $BODY$ LANGUAGE plpgsql STABLE; ALTER FUNCTION geocode_carrier_route_by_geocode(character) OWNER TO root; --Runs in 20 seconds select * from geocode_route_by_geocode('999xyz'); --Runs in 10 milliseconds SELECT gs.geo_shape_id AS gid,gs.geocode FROM geo_shapes gs WHERE geocode = '9999xyz' AND geo_type = 1 GROUP BY geography,geocode 解决方法
PostgreSQL 9.2中的更新
有一个重大改进,我引用release notes here:
PostgreSQL 9.1或更早版本的原始答案 plpgsql函数具有与PREPARE语句类似的效果:解析查询并缓存查询计划. 优点是每次调用都会节省一些开销. 对于具有偶数数据分布的表的查询,这通常没有问题,并且PL / pgSQL函数的执行速度比原始SQL查询或SQL函数快一些.但是,如果您的查询可以根据WHERE子句中的实际值使用某些索引,或者更一般地,为特定值选择更好的查询计划,则最终可能会得到次优查询计划.尝试使用SQL函数或使用 CREATE OR REPLACE FUNCTION pie(id_param integer) RETURNS SETOF record AS $BODY$ BEGIN RETURN QUERY EXECUTE 'SELECT * FROM table_name where id = $1' USING id_param; END $BODY$ LANGUAGE plpgsql STABLE; 评论后编辑: 如果此变体不会改变执行时间,则必须有其他因素可能已经错过或未提及.不同数据库?不同的参数值?你必须发布更多细节. 我添加一个引用from the manual来支持我的上述陈述:
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |