"""adj_factor 覆盖索引:因子查询免堆访问(碎片免疫) Revision ID: 20260902_01 Revises: 20260815_04 Create Date: 2026-09-02 """ from typing import Sequence, Union from alembic import op revision: str = "20260902_01" down_revision: Union[str, Sequence[str], None] = "20260815_04" branch_labels: Union[str, Sequence[str], None] = None depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: # CONCURRENTLY / VACUUM 不能在事务内执行;autocommit_block 内每条语句独立提交 with op.get_context().autocommit_block(): op.create_index( "ix_adj_code_date_cover", "adj_factor", ["ts_code", "trade_date"], postgresql_concurrently=True, postgresql_include=["adj_factor"], ) # ts_code 单列索引被覆盖索引取代(同前缀),删掉省写放大 op.drop_index( "ix_adj_factor_ts_code", table_name="adj_factor", postgresql_concurrently=True, ) # 刷可见性映射(Index Only Scan 的前提)+ 更新统计信息;低峰执行(3.2GB 表数十秒) op.execute("VACUUM (ANALYZE) adj_factor") def downgrade() -> None: with op.get_context().autocommit_block(): op.create_index( "ix_adj_factor_ts_code", "adj_factor", ["ts_code"], postgresql_concurrently=True, ) op.drop_index( "ix_adj_code_date_cover", table_name="adj_factor", postgresql_concurrently=True, )