假设我有一个包含字段A和B的表.我在A B上进行常规查询,因此我在(A,B)上创建了一个复合索引.只有A的查询是否也会被复合索引完全优化?
另外,我在A上创建了一个索引,但是Postgres仍然只使用复合索引进行查询.如果之前的答案是肯定的,我想这并不重要,但为什么默认选择复合索引,如果单A指数可用吗?
必然是.我们在这个相关问题下详细讨论了这个问题:
> Working of indexes in PostgreSQL
空间以MAXALIGN的倍数分配,在64位操作系统上通常为8个字节,或者在32位操作系统上为(不太常见)4个字节.如果您不确定,请检查pg_controldata
.它还取决于索引列的数据类型(一些需要对齐填充)和实际内容.
例如,两个整数列上的索引通常最终与一个索引上的索引一样大.对于仅一个整数(4个字节),添加另外4个字节的对齐填充.
在这种情况下,查询规划器在(a,b)上使用索引与 – (a)上的索引相比确实没有缺点.并且通常优选多个查询使用相同的索引.共享时,它已经(或部分)驻留在缓存中的机会增加了.
如果你已经在(a,b)上维护了一个索引,那么仅在(a)上创建另一个索引是没有意义的 – 除非它实际上更小. (b,a)与(a)的情况不同.请按照第一行中的链接获取更多信息.
另一方面,在索引中包含其他列可能存在缺点,即使它仅使用空间,否则会丢失对齐填充.如果更新了其他列,则索引也需要更新.当涉及此列时,还会阻止表上的潜在HOT(仅堆元组)更新.
有关HOT更新的更多信息
> Redundant data in update statements
如何测量对象大小: