Files
2026-07-08 13:13:46 -04:00

65 lines
2.3 KiB
SQL

-- Performance Indexes for BaseItems Table
-- These indexes improve performance of grouping queries in BaseItemRepository
-- Run on PostgreSQL database
\pset pager off
-- Connect to your Jellyfin database first:
-- \c jellyfin_testdata
-- Index for PresentationUniqueKey grouping
-- Used by queries that group by PresentationUniqueKey
CREATE INDEX CONCURRENTLY IF NOT EXISTS "IX_BaseItems_PresentationUniqueKey"
ON library."BaseItems" ("PresentationUniqueKey")
WHERE "PresentationUniqueKey" IS NOT NULL;
-- Index for SeriesPresentationUniqueKey grouping
-- Used by queries that group by SeriesPresentationUniqueKey
CREATE INDEX CONCURRENTLY IF NOT EXISTS "IX_BaseItems_SeriesPresentationUniqueKey"
ON library."BaseItems" ("SeriesPresentationUniqueKey")
WHERE "SeriesPresentationUniqueKey" IS NOT NULL;
-- Composite index for queries using both keys
-- Covers the case where both grouping keys are used together
CREATE INDEX CONCURRENTLY IF NOT EXISTS "IX_BaseItems_PresentationKeys_Composite"
ON library."BaseItems" ("PresentationUniqueKey", "SeriesPresentationUniqueKey", "Id")
WHERE "PresentationUniqueKey" IS NOT NULL
OR "SeriesPresentationUniqueKey" IS NOT NULL;
-- Index for Type + TopParentId (common filter combination)
-- Improves WHERE clause filtering before grouping
CREATE INDEX CONCURRENTLY IF NOT EXISTS "IX_BaseItems_Type_TopParentId"
ON library."BaseItems" ("Type", "TopParentId")
WHERE "TopParentId" IS NOT NULL;
-- Index for Type + TopParentId + PresentationUniqueKey (covering index)
-- Covers the entire query pattern for TV Series queries
CREATE INDEX CONCURRENTLY IF NOT EXISTS "IX_BaseItems_Series_Grouping"
ON library."BaseItems" ("Type", "TopParentId", "PresentationUniqueKey", "Id")
WHERE "Type" = 'MediaBrowser.Controller.Entities.TV.Series'
AND "TopParentId" IS NOT NULL;
-- ANALYZE to update statistics after creating indexes
ANALYZE library."BaseItems";
-- Verify indexes were created
SELECT
schemaname,
tablename,
indexname,
indexdef
FROM pg_indexes
WHERE tablename = 'BaseItems'
AND schemaname = 'library'
ORDER BY indexname;
-- Check index sizes
SELECT
schemaname,
tablename,
indexname,
pg_size_pretty(pg_relation_size(indexrelid)) AS index_size
FROM pg_stat_user_indexes
WHERE tablename = 'BaseItems'
AND schemaname = 'library'
ORDER BY pg_relation_size(indexrelid) DESC;