-- Migration 0020: Index fuer die eigene-Sitzungen-Abfrage (Teil F.3.6, -- Umsetzungsauftrag_Sonnet5.md): GET /catalog/sessions (app/catalog/ -- routes.py) filtert immer nach user_id UND (im Standardfall -- active_only=true) zusaetzlich nach ended_at IS NULL. -- -- Bisher existierte nur idx_sessions_user (user_id allein, -- app/db/migrations/0001_initial.sql:107) -- fuer eine wachsende -- sessions-Tabelle waere "meine noch offenen Sitzungen" damit ein -- Index-Scan ueber ALLE Sitzungen dieses Benutzers mit anschliessendem -- Filter auf ended_at, statt direkt auf die (typischerweise sehr kleine) -- Teilmenge der offenen Sitzungen zuzugreifen. -- -- Ein zusammengesetzter Index (user_id, ended_at) deckt per -- SQLite-Index-Praefix-Regel sowohl "alle meine Sitzungen" (user_id -- allein) als auch "meine offenen Sitzungen" (user_id + ended_at) ab und -- macht idx_sessions_user damit redundant -- bewusst NICHT geloescht -- (Projektkonvention: Indizes/Tabellen werden beim Rueckbau nicht -- gedroppt, siehe 0019_retire_direct_role_grants.sql; ausserdem nutzen -- andere Abfragen im Adminbereich, z.B. GET /admin/sessions, weiterhin -- ausschliesslich user_id ueber JOINs, nicht ueber diesen Index). CREATE INDEX IF NOT EXISTS idx_sessions_user_ended ON sessions(user_id, ended_at);