183 lines
6.3 KiB
SQL
183 lines
6.3 KiB
SQL
-- Jellyfin strict index-removal runbook
|
|
-- Strategy: exactly ONE DROP per maintenance window.
|
|
-- Generated: 2026-03-08
|
|
--
|
|
-- Important:
|
|
-- 1) Execute only one window per maintenance period.
|
|
-- 2) Keep each statement standalone (no BEGIN/COMMIT around CONCURRENTLY).
|
|
-- 3) If regression appears, run that window's rollback CREATE INDEX CONCURRENTLY.
|
|
|
|
/* =====================================================================
|
|
Shared baseline (run before each window)
|
|
===================================================================== */
|
|
SELECT
|
|
now() AS captured_at,
|
|
schemaname,
|
|
relname AS table_name,
|
|
indexrelname AS index_name,
|
|
idx_scan,
|
|
idx_tup_read,
|
|
idx_tup_fetch,
|
|
pg_size_pretty(pg_relation_size(indexrelid)) AS index_size
|
|
FROM pg_stat_user_indexes
|
|
WHERE schemaname IN ('library', 'authentication', 'users', 'activitylog', 'displaypreferences')
|
|
ORDER BY idx_scan ASC, pg_relation_size(indexrelid) DESC;
|
|
|
|
/* =====================================================================
|
|
WINDOW 1 (lowest risk first)
|
|
Target: library.IX_MediaStreamInfos_StreamIndex_StreamType_Language
|
|
===================================================================== */
|
|
-- Drop:
|
|
DROP INDEX CONCURRENTLY IF EXISTS library."IX_MediaStreamInfos_StreamIndex_StreamType_Language";
|
|
|
|
-- Verify impact:
|
|
SELECT
|
|
now() AS check_time,
|
|
relname AS table_name,
|
|
indexrelname AS index_name,
|
|
idx_scan,
|
|
idx_tup_read,
|
|
idx_tup_fetch,
|
|
pg_size_pretty(pg_relation_size(indexrelid)) AS index_size
|
|
FROM pg_stat_user_indexes
|
|
WHERE schemaname = 'library'
|
|
AND relname = 'MediaStreamInfos'
|
|
ORDER BY idx_scan ASC, pg_relation_size(indexrelid) DESC;
|
|
|
|
-- Rollback (recreate):
|
|
CREATE INDEX CONCURRENTLY "IX_MediaStreamInfos_StreamIndex_StreamType_Language"
|
|
ON library."MediaStreamInfos" USING btree ("StreamIndex", "StreamType", "Language");
|
|
|
|
/* =====================================================================
|
|
WINDOW 2
|
|
Target: library.IX_MediaStreamInfos_StreamIndex_StreamType
|
|
===================================================================== */
|
|
-- Drop:
|
|
DROP INDEX CONCURRENTLY IF EXISTS library."IX_MediaStreamInfos_StreamIndex_StreamType";
|
|
|
|
-- Verify impact:
|
|
SELECT
|
|
now() AS check_time,
|
|
relname AS table_name,
|
|
indexrelname AS index_name,
|
|
idx_scan,
|
|
idx_tup_read,
|
|
idx_tup_fetch,
|
|
pg_size_pretty(pg_relation_size(indexrelid)) AS index_size
|
|
FROM pg_stat_user_indexes
|
|
WHERE schemaname = 'library'
|
|
AND relname = 'MediaStreamInfos'
|
|
ORDER BY idx_scan ASC, pg_relation_size(indexrelid) DESC;
|
|
|
|
-- Rollback (recreate):
|
|
CREATE INDEX CONCURRENTLY "IX_MediaStreamInfos_StreamIndex_StreamType"
|
|
ON library."MediaStreamInfos" USING btree ("StreamIndex", "StreamType");
|
|
|
|
/* =====================================================================
|
|
WINDOW 3
|
|
Target: library.IX_MediaStreamInfos_StreamIndex
|
|
===================================================================== */
|
|
-- Drop:
|
|
DROP INDEX CONCURRENTLY IF EXISTS library."IX_MediaStreamInfos_StreamIndex";
|
|
|
|
-- Verify impact:
|
|
SELECT
|
|
now() AS check_time,
|
|
relname AS table_name,
|
|
indexrelname AS index_name,
|
|
idx_scan,
|
|
idx_tup_read,
|
|
idx_tup_fetch,
|
|
pg_size_pretty(pg_relation_size(indexrelid)) AS index_size
|
|
FROM pg_stat_user_indexes
|
|
WHERE schemaname = 'library'
|
|
AND relname = 'MediaStreamInfos'
|
|
ORDER BY idx_scan ASC, pg_relation_size(indexrelid) DESC;
|
|
|
|
-- Rollback (recreate):
|
|
CREATE INDEX CONCURRENTLY "IX_MediaStreamInfos_StreamIndex"
|
|
ON library."MediaStreamInfos" USING btree ("StreamIndex");
|
|
|
|
/* =====================================================================
|
|
WINDOW 4 (medium risk)
|
|
Target: library.baseitemproviders_providerid_idx
|
|
===================================================================== */
|
|
-- Drop:
|
|
DROP INDEX CONCURRENTLY IF EXISTS library.baseitemproviders_providerid_idx;
|
|
|
|
-- Verify impact:
|
|
SELECT
|
|
now() AS check_time,
|
|
relname AS table_name,
|
|
indexrelname AS index_name,
|
|
idx_scan,
|
|
idx_tup_read,
|
|
idx_tup_fetch,
|
|
pg_size_pretty(pg_relation_size(indexrelid)) AS index_size
|
|
FROM pg_stat_user_indexes
|
|
WHERE schemaname = 'library'
|
|
AND relname = 'BaseItemProviders'
|
|
ORDER BY idx_scan ASC, pg_relation_size(indexrelid) DESC;
|
|
|
|
-- Rollback (recreate):
|
|
CREATE INDEX CONCURRENTLY baseitemproviders_providerid_idx
|
|
ON library."BaseItemProviders" USING btree ("ProviderId", "ItemId");
|
|
|
|
/* =====================================================================
|
|
WINDOW 5 (medium risk)
|
|
Target: library.baseitemproviders_providervalue_idx
|
|
===================================================================== */
|
|
-- Drop:
|
|
DROP INDEX CONCURRENTLY IF EXISTS library.baseitemproviders_providervalue_idx;
|
|
|
|
-- Verify impact:
|
|
SELECT
|
|
now() AS check_time,
|
|
relname AS table_name,
|
|
indexrelname AS index_name,
|
|
idx_scan,
|
|
idx_tup_read,
|
|
idx_tup_fetch,
|
|
pg_size_pretty(pg_relation_size(indexrelid)) AS index_size
|
|
FROM pg_stat_user_indexes
|
|
WHERE schemaname = 'library'
|
|
AND relname = 'BaseItemProviders'
|
|
ORDER BY idx_scan ASC, pg_relation_size(indexrelid) DESC;
|
|
|
|
-- Rollback (recreate):
|
|
CREATE INDEX CONCURRENTLY baseitemproviders_providervalue_idx
|
|
ON library."BaseItemProviders" USING btree ("ProviderValue", "ProviderId");
|
|
|
|
/* =====================================================================
|
|
WINDOW 6 (highest risk among current candidates; keep for last)
|
|
Target: library.IX_BaseItemProviders_ProviderId_ProviderValue_ItemId
|
|
===================================================================== */
|
|
-- Drop:
|
|
DROP INDEX CONCURRENTLY IF EXISTS library."IX_BaseItemProviders_ProviderId_ProviderValue_ItemId";
|
|
|
|
-- Verify impact:
|
|
SELECT
|
|
now() AS check_time,
|
|
relname AS table_name,
|
|
indexrelname AS index_name,
|
|
idx_scan,
|
|
idx_tup_read,
|
|
idx_tup_fetch,
|
|
pg_size_pretty(pg_relation_size(indexrelid)) AS index_size
|
|
FROM pg_stat_user_indexes
|
|
WHERE schemaname = 'library'
|
|
AND relname = 'BaseItemProviders'
|
|
ORDER BY idx_scan ASC, pg_relation_size(indexrelid) DESC;
|
|
|
|
-- Rollback (recreate):
|
|
CREATE INDEX CONCURRENTLY "IX_BaseItemProviders_ProviderId_ProviderValue_ItemId"
|
|
ON library."BaseItemProviders" USING btree ("ProviderId", "ProviderValue", "ItemId");
|
|
|
|
/* =====================================================================
|
|
Explicit exclusions (do not remove in this runbook)
|
|
=====================================================================
|
|
- Any PK_* index
|
|
- Any UNIQUE index enforcing constraints
|
|
- users.IX_Users_Username
|
|
- authentication.IX_DeviceOptions_DeviceId
|
|
===================================================================== */ |