- random: md5(seed) -> uuid startu, okno 2000 id (8000 dla wertykalow) po pk_scenes, filtry na oknie; bez okna planer robil Merge Anti Join po 2,3 mln wierszy (7,6 s) - duration_desc/asc: bez NULL, do 10 h, indeks ix_scenes_duration (migracja 0035) Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
35 lines
1.2 KiB
Python
35 lines
1.2 KiB
Python
"""Indeks pod sortowanie scen po dlugosci (najdluzsze / najkrotsze).
|
|
|
|
Jeden indeks (duration_sec, created_at, id) WHERE duration_sec IS NOT NULL obsluguje
|
|
oba kierunki: skan w przod daje najkrotsze, w tyl najdluzsze. Sceny bez dlugosci sa
|
|
odfiltrowane w zapytaniu, wiec kolejnosc NULL-i nie gra roli i wystarczy jeden indeks.
|
|
|
|
CONCURRENTLY w autocommit_block, jak w 0027: zwykly CREATE INDEX blokowalby zapisy
|
|
ingestu na czas budowy (4,1 mln wierszy). Nieudany CONCURRENTLY zostawia indeks
|
|
INVALID; wtedy DROP INDEX i ponownie.
|
|
|
|
Revision ID: 0035_scenes_duration_idx
|
|
Revises: 0034_favorite_sites
|
|
Create Date: 2026-09-14
|
|
"""
|
|
from __future__ import annotations
|
|
|
|
from alembic import op
|
|
|
|
revision = "0035_scenes_duration_idx"
|
|
down_revision: str | None = "0034_favorite_sites"
|
|
branch_labels = None
|
|
depends_on = None
|
|
|
|
|
|
def upgrade() -> None:
|
|
with op.get_context().autocommit_block():
|
|
op.execute(
|
|
"CREATE INDEX CONCURRENTLY IF NOT EXISTS ix_scenes_duration "
|
|
"ON scenes (duration_sec, created_at, id) WHERE duration_sec IS NOT NULL"
|
|
)
|
|
|
|
|
|
def downgrade() -> None:
|
|
with op.get_context().autocommit_block():
|
|
op.execute("DROP INDEX CONCURRENTLY IF EXISTS ix_scenes_duration")
|