有一个带有复合索引(COL1、COL2、COL3)的表.这个表中有很多数据. 我想构建查询,例如WHERE COL1=2,COL2=12,COL3 IN(1,2,3,...,40) 有没有办法完全使用索引(有3列)?

当我try 的时候

SELECT *
FROM table t
WHERE t.col1 = 2
    AND t.col2 = 12
    AND t.col3 IN (1, 2, 3, ..., 40)

Postgres计划器对(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列使用某种复合索引?

推荐答案

根据您的 comments ,看起来我们可以通过对(col1, col2, col3) = (arg1, arg2, arg3)的显式联接来强制使用索引.

我不知道您是如何调用这个查询的,但如果从允许通过数据库驱动程序传递int[]类型的主机语言调用,我的查询将如下所示:

with invars as (
  select 2 as c1val, 12 as c2val,
         array[1, 2, 3, 4, 5, 6, 40] as c3vals  
), search_tuples as (
  select i.c1val, i.c2val, u.c3val
    from invars i
         cross join lateral unnest(i.c3vals) as u(c3val)
)
select t.*
  from search_tuples s
       join table1 t 
    on (t.col1, t.col2, t.col3) = (s.c1val, s.c2val, s.c3val);

A working fiddle with random test records and explain

Sql相关问答推荐

如何更改函数返回的列名?

SUM(条件)在Oracle?

JSON列之间的Postgr聚合

如何在幂函数中正确使用Power()和Exp()

retrofit AWS Athena中的JSON

我怎样才能得到列值对应的最大值在另一个?

仅在日期相隔时递增(Oracle SQL)

删除行而不使数据库超载

使用 Oracle SQL Developer 将不同的列值转换为列会导致错误 ORA-01489

替换SQL Server XML中多处出现的 node 值

计算组内多个日期间隔go 年的累计天数

SQL 中的第一个值和倒数第二个值

SQL:无重复项的两个聚合函数

如何通过CROSS APPLY获取多级嵌套JSON属性的值?

joins 组合多个重复数据删除策略

PostgreSQL:通过数组的元素从另一个表中 Select 数据,然后按顺序显示

String_Split 多列

为数组中的每个元素从表中收集最大整数

如何通过子 Select 在一次更新(并行数组)中多次更新相同的行

聚合 Athena 中的列