PostgreSQL稀疏索引删除数据后索引块结构变化的技术问询
PostgreSQL稀疏索引删除条目后的块行为解析
好问题!咱们来拆解PostgreSQL中这类索引(你提到的应该是B-tree结构下的稀疏索引条目)在删除块内条目A后的具体行为:
- 不会直接将索引块标识改为B:索引块本身有独立的物理块ID,不会因为内部某个条目被删除就把块的标识换成B。原来的索引数据块还是那个块,只是内部少了A的条目。
- 删除后块内会留下空闲空间(即你说的‘-’状态):删除A后,该条目在块内的位置会被标记为空闲,此时索引块的结构会变成
[空闲位置, B, C...]。PostgreSQL会通过**空闲空间映射(Free Space Map, FSM)**来追踪这个块里的可用空间,而不是直接删除后就移位B、C填补空白。 - 空闲空间会被优先复用:后续如果有新的索引条目需要插入,PostgreSQL会优先把新条目放到A原来的空闲位置里,只有当空闲空间不够或者块使用率过低时,才会触发条目移位、块合并等操作。
- 块合并是触发式的:只有当这个索引块的空闲空间超过一定阈值(比如低于B-tree默认的90%填充因子),才会和相邻的索引块合并,把B、C等条目移到相邻块,然后释放当前块。但仅仅删除单个A条目时,块会被保留,空闲空间等待复用。
简单来说,删除A后,索引块还是原来的那个块,内部呈现的是[空闲位置, B, C...]的状态,而不是直接把块改成以B开头的结构。
内容的提问来源于stack exchange,提问作者Ankit Kumar
相关产品推荐
相关产品推荐

