0

在我们的代码库中,我们在数据库中有许多发现,它们允许以基本上任何组合搜索可变数量的参数。其中大部分通常写成如下:

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 是否会这样做。

这是构建这些查询的糟糕方法吗?如果是这样,有没有更好的方法?

需要注意的是,我们曾经对存储过程中的每个可能的参数组合进行硬编码,但这变得难以维护,因为在存储过程中添加、删除或更改参数影响很大,很容易错过一个参数组合需要更新,或者错误地订购参数检查并落入错误的情况。

4

1 回答 1

1

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

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

于 2013-09-09T19:43:38.043 回答