在我们的代码库中,我们在数据库上有许多发现,它们允许以基本上任意组合搜索可变数量的参数。其中大部分内容一般如下:
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中添加,删除或更改参数这么多,很容易错过组合需要更新的参数,或者错误地命令参数检查并落入错误的情况。
答案 0 :(得分:1)
Postgres可能会使用位图索引,然后对结果进行AND / OR以便快速检索。
http://www.postgresql.org/message-id/12553.1135634231@sss.pgh.pa.us