"""add performance indexes 쿼리 성능 향상을 위한 복합 인덱스 추가. 자주 사용되는 필터 및 조회 패턴에 맞춰 인덱스를 생성합니다. Revision ID: 0002 Revises: 0001 Create Date: 2026-03-10 """ from typing import Sequence, Union from alembic import op revision: str = "0002" down_revision: Union[str, None] = "0001" branch_labels: Union[str, Sequence[str], None] = None depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: # ── trade_history 인덱스 ────────────────────────────────────────────── with op.batch_alter_table("trade_history", schema=None) as batch_op: batch_op.create_index( "ix_trade_history_status_created_at", ["status", "created_at"], ) batch_op.create_index( "ix_trade_history_stock_order_created", ["stock_code", "order_type", "created_at"], ) # ── market_data 인덱스 ──────────────────────────────────────────────── with op.batch_alter_table("market_data", schema=None) as batch_op: batch_op.create_index( "ix_market_data_stock_code_timestamp", ["stock_code", "timestamp"], ) # ── stock_analysis 인덱스 ───────────────────────────────────────────── with op.batch_alter_table("stock_analysis", schema=None) as batch_op: batch_op.create_index( "ix_stock_analysis_stock_code_analysis_date", ["stock_code", "analysis_date"], ) # ── portfolio 인덱스 ────────────────────────────────────────────────── with op.batch_alter_table("portfolio", schema=None) as batch_op: batch_op.create_index( "ix_portfolio_quantity", ["quantity"], ) # ── active_trades 인덱스 ────────────────────────────────────────────── with op.batch_alter_table("active_trades", schema=None) as batch_op: batch_op.create_index( "ix_active_trades_stock_code_status", ["stock_code", "status"], ) batch_op.create_index( "ix_active_trades_status", ["status"], ) # ── watchlist_stocks 인덱스 ─────────────────────────────────────────── with op.batch_alter_table("watchlist_stocks", schema=None) as batch_op: batch_op.create_index( "ix_watchlist_stocks_is_active_stock_code", ["is_active", "stock_code"], ) # ── claude_analysis_log 인덱스 ──────────────────────────────────────── with op.batch_alter_table("claude_analysis_log", schema=None) as batch_op: batch_op.create_index( "ix_claude_analysis_log_stock_code_created_at", ["stock_code", "created_at"], ) def downgrade() -> None: # ── claude_analysis_log ─────────────────────────────────────────────── with op.batch_alter_table("claude_analysis_log", schema=None) as batch_op: batch_op.drop_index("ix_claude_analysis_log_stock_code_created_at") # ── watchlist_stocks ────────────────────────────────────────────────── with op.batch_alter_table("watchlist_stocks", schema=None) as batch_op: batch_op.drop_index("ix_watchlist_stocks_is_active_stock_code") # ── active_trades ───────────────────────────────────────────────────── with op.batch_alter_table("active_trades", schema=None) as batch_op: batch_op.drop_index("ix_active_trades_status") batch_op.drop_index("ix_active_trades_stock_code_status") # ── portfolio ───────────────────────────────────────────────────────── with op.batch_alter_table("portfolio", schema=None) as batch_op: batch_op.drop_index("ix_portfolio_quantity") # ── stock_analysis ──────────────────────────────────────────────────── with op.batch_alter_table("stock_analysis", schema=None) as batch_op: batch_op.drop_index("ix_stock_analysis_stock_code_analysis_date") # ── market_data ─────────────────────────────────────────────────────── with op.batch_alter_table("market_data", schema=None) as batch_op: batch_op.drop_index("ix_market_data_stock_code_timestamp") # ── trade_history ───────────────────────────────────────────────────── with op.batch_alter_table("trade_history", schema=None) as batch_op: batch_op.drop_index("ix_trade_history_stock_order_created") batch_op.drop_index("ix_trade_history_status_created_at")