考虑我有一个表T,其中字段a,b,c,d有两个索引:首先是a,b,c字段,第二个是a,b,d字段。 a,b,c和d的类型是整数。这两个指数几乎相同(在生产时它们都有大约2Gb的大小,它们具有相同的创建时间和相同的使用统计数据,表总体上有大约6千万行)。 我提出两个问题:
我希望对于a,b,c字段使用第一个查询索引,对于a,b,d字段使用第二个索引。然而事实并非如此,并且对于两个查询都使用第一个索引,但在第二种情况下使用" filter"(我使用expect analyze来获得这些知识)。对我来说,这种行为是不可接受的,因为在某些情况下,过滤器中的条目数量增长得非常快,并且autovacuum / analyze(实际上有助于规划人员使用正确的索引)的工作速度太慢,无法防止意外的延迟和停机。
所以我的问题是:如何强制postgresql不要使用错误的索引进行过滤,而是在查询的所有字段中使用正确的索引'其中'并在那个指数匹配?
答案 0 :(得分:0)
最后我找到了解决方案。它并不完美,我不会把它标记为最好的,但它有效,可以帮助别人。
我实际做的是我已经改变了指数,而不是a,b,c和a,b,d指数现在我有c,a,b和d,a,b。
出现了一个问题:我需要一个'a'索引,因为有些查询依赖它。然而,当我仅在'a'上添加索引时,第一个帖子的问题再次出现(当计划者认为其成本低于c,a,b或d,a,b的成本时,使用'a'上的索引)。所以我决定在表中添加一个新字段,这是一个字段'a'的副本(具有相同的数据),让我们称之为'a1',然后我在这个字段上添加了索引。现在当我需要以某种方式过滤'a'的内容而不是过滤'a1'字段时。这很奇怪,但我找不到另一种解决方案。