我有一个 PostgreSQL 表,其中有两列名为col1and col2,都是整数类型(表中有大约 10M 行)。我想执行 SQL 查询,例如:
SELECT * FROM table WHERE col1 >= val1 AND col2 <= val2;
Run Code Online (Sandbox Code Playgroud)
(对某些val1和val2我知道的查询时间)。
如果我将 btree 索引放在上面col1并且col2PostgreSQL 尝试执行查询,在两列之一上执行索引扫描,然后在另一列上进行过滤。这意味着在大多数情况下,它必须扫过大约一半的表,即使匹配的行数很少。添加多列索引是没有用的,因为只有当两列中的至少一列经过相等性测试时,PostgreSQL 才能有效地使用它。
不过,我可以对这些值做出的一个重要假设是,这两列相对于另一列是单调的。这意味着如果在一行col1中大于或等于col1另一行中的两个,则两个对应col2条目之间的相同关系是有效的。
这意味着原则上可以通过对两列之一执行索引扫描、过滤另一列并在第二列上发现不匹配的值时立即停止执行来加快查询执行速度。在这种情况下,查询将准确读取要返回的行。
有什么方法可以在 PostgreSQL 中设置索引或任何其他不变量,以便查询规划器能够检测到这一点?
(当然,问题可以通过执行两个查询轻松解决,第一个将不等式col2转换为不等式 on col1;我问是否有办法避免这种解决方法并让 PostgreSQL 自己管理混乱)