有一个复合索引表(col1,col2,col3)。这张表里有很多数据。想构建查询,例如WHERE col1 = 2 AND col2 = 12 AND col3 IN(1,2,3,...,40)是否有一种方法可以完全使用索引(3列)?
当我努力的时候
SELECT *
FROM table t
WHERE t.col1 = 2
AND t.col2 = 12
AND t.col3 IN (1, 2, 3, ..., 40)
字符串
Postgres planner对(col1,col2)进行索引扫描,然后使用SeqScan逐个过滤400k行,col3 IN (1, 2, 3, ..., 40)
如果我尝试
SELECT *
FROM table t
WHERE (col1, col2, col3) IN VALUES (2, 12, 1), (2, 12, 2), (2, 12, 3), ... ,(2, 12, 40)
型
它给出错误:
临时文件大小超过temp_file_limit
所以它工作缓慢。有没有一种方法可以让postgres对3列使用复合索引?
2条答案
按热度按时间6gpjuf901#
根据您的评论,看起来我们可以通过
(col1, col2, col3) = (arg1, arg2, arg3)
上的显式连接强制使用索引。我不知道你是如何调用这个查询的,但是如果从一个允许通过数据库驱动程序传递
int[]
类型的宿主语言调用,我的查询将看起来像这样:字符串
A working fiddle with random test records and
explain
hivapdat2#
您可以尝试将
col3
可能的值加载到一个真正的表中,然后将查询重写为以下内容:字符串
假设
table2
具有以下结构:型
table1
可以使用(col1, col2, col3)
上的索引。还应该在table2 (col3)
上放置一个索引,以确保快速查找。