我需要创建一个 Postgres 9.1 PL/pgSQL 存储过程,除其他参数外,它采用一系列值,这些值直接引用我的一个数据库列中的值。据我所知,在 Postgres 中执行此操作的规范方法是使用数组。
当然,这是一项相当基本的任务。我的问题是可扩展性:我的代码基本上可以工作,但是一旦传入的序列变大(如数百或数千个值),性能就会很差:
在我的存储过程中使用表单中的数组甚至是相当简单的 SELECT 语句
SELECT <some columns>
FROM <some tables>
WHERE <some other select criteria>
AND <column with values selected by array parameter>
IN (SELECT * FROM unnest(<array parameter>))
即使数据库还不是很大并且数组中只有几十个值,也需要几秒钟来执行。
我的第一个怀疑是这unnest(...)
就是问题所在,但是仅从具有数组参数中引用的列的表中选择非常快:
SELECT <some columns>
FROM <table with column ref'd in array parameter>
WHERE <column with values selected by array parameter>
IN (SELECT * FROM unnest(<array parameter>))
只需要几毫秒。
我的问题:
- 有没有使用数组作为参数的替代方法?
- 如何让我的查询表现更好?