优化PostgreSQL查找Sproc

时间:2013-09-09 16:09:01

标签: postgresql optimization

在我们的代码库中,我们在数据库上有许多发现,它们允许以基本上任意组合搜索可变数量的参数。其中大部分内容一般如下:

CREATE OR REPLACE FUNCTION getObject(p_field1 INTEGER, p_field2 INTEGER, 
  p_field3 INTEGER, p_field4 INTEGER, p_field5 INTEGER)
    RETURNS SETOF Object
AS $_$
BEGIN
  RETURN QUERY SELECT * FROM Table_ent_Object
    WHERE (p_field1 = 0 OR Field1 = p_field1)
      AND (p_field2 = 0 OR Field2 = p_field2)
      AND (p_field3 = 0 OR Field3 = p_field3)
      AND (p_field4 = 0 OR Field4 = p_field4)
      AND (p_field5 = 0 OR Field5 = p_field5);
END;
$_$
LANGUAGE plpgsql;

有人知道SQL但不知道PostgreSQL,这在SQL中表现不佳,因为它不允许事先开发出一个优化良好的查询计划,但她不知道PostgreSQL是否会起作用相同。

这是构建这些查询的一种不好的方法吗?如果是这样,有更好的方法吗?

作为一个注释,我们过去常常在sprocs中对每个可能的参数组合进行硬编码,但是这很难维护,因为在sproc中添加,删除或更改参数这么多,很容易错过组合需要更新的参数,或者错误地命令参数检查并落入错误的情况。

1 个答案:

答案 0 :(得分:1)

Postgres可能会使用位图索引,然后对结果进行AND / OR以便快速检索。

http://www.postgresql.org/message-id/12553.1135634231@sss.pgh.pa.us