6

需要想出一种方法来有效地执行查询,其中包含WHERE子句中的数组和整数列,按时间戳列排序。使用 PostgreSQL 9.2。

我们需要执行的查询是:

SELECT id 
from table 
where integer = <int_value> 
  and <text_value> = any (array_col) 
order by timestamp 
limit 1;

int_value是一个整数值,text_value是一个 1 - 3 个字母的文本值。

表结构是这样的:

    专栏 | 类型 | 修饰符
---------------+------------------+---- --------------------
 编号 | 正文 | 不为空
 时间戳 | 没有时区的时间戳|
 array_col | 文本[] |
 整数 | 整数 |

我应该如何设计索引/修改查询以使其尽可能高效?

非常感谢!让我知道是否需要更多信息,我会尽快更新。

4

2 回答 2

2

PG 可以在数组上使用索引,但您必须为此使用数组运算符,而不是<text_value> = any (array_col)使用ARRAY[<text_value>]<@array_col( https://stackoverflow.com/a/4059785/2115135 )。SET enable_seqscan=false;如果可以查看您创建的索引是否有效,您可以使用该命令强制 pg 使用索引。不幸的是GIN,无法在整数列上创建索引,因此您必须为这两列创建两个不同的索引。在此处查看执行计划:http ://sqlfiddle.com/#!12/66a71/2

于 2013-03-19T16:38:41.207 回答
0

不幸的是,不能在整数列上创建 GIN 索引,因此您必须为这两个列创建两个不同的索引。

这并不完全正确,您可以使用btree_gin或 -btree_gist

-- feel free to use GIN
CREATE EXTENSION btree_gist;
CREATE INDEX ON table USING gist(id, array_col, timestamp);
VACUUM FULL ANALYZE table;

现在您可以在索引本身上运行该操作

SELECT *
FROM table
WHERE id = ? AND array_col @> ?
ORDER BY timestamp;
于 2018-06-12T09:23:59.970 回答