Files
pgsql-jellyfin/docs/QUICK_ACTION_PLAN.md
T
wjones 78c8d4256c Docs reorg, config refactor, and ItemValues index fix
- Moved all documentation to docs/ and updated README with categorized links and new docs/INDEX.md
- Added HOW_TO_SWITCH_DATABASE.md and several new analysis/action docs
- Introduced db-config.ps1 for centralized DB config; all scripts now use it for easy DB switching
- Added db-quick.ps1 for interactive diagnostics and index management
- Updated Add-All-Indexes.bat to use db-config.ps1
- Added Fix-ItemValues-Performance.ps1 to create 3 critical indexes on ItemValues, addressing 1.3B row seq scan issue
- Updated performance_indexes.sql with new ItemValues indexes and ANALYZE
- Updated diagnostics.sql and database_report.txt for improved output and clarity
- All scripts and docs now reference the new config and index optimization workflow
2026-02-28 16:23:43 -05:00

5.2 KiB

Quick Action Plan - Based on Your Diagnostics

🎯 What Your Diagnostics Revealed

Good:

  • No errors, no locks, no blocking
  • Most tables have excellent index usage (94-99%)
  • Supplementary indexes installed correctly

⚠️ Issues:

  • ItemValues table: 1.3 BILLION rows read via sequential scans! 😱
  • Peoples table: 918 million rows read
  • Supplementary indexes: Almost unused (0-10 uses)

🚀 What To Do Now

Step 1: Use Jellyfin Normally (This Week)

The supplementary indexes we created target specific user interactions. You need to actually use Jellyfin to see if they help!

Do these actions:

Browse Recently Added

Dashboard → Recently Added

Tests: idx_baseitems_datecreated_filtered

Filter by Genre/Tags

Movies → Filter → Genre → Action
TV Shows → Filter → Tags → Drama

Tests: idx_itemvaluesmap_itemvalueid_itemid

Browse Libraries

Movies → Browse folders
TV Shows → Navigate seasons

Tests: idx_baseitems_type_isvirtualitem_topparentid

Step 2: Run Diagnostics Again (End of Week)

& "C:\Program Files\PostgreSQL\18\bin\psql.exe" -U jellyfin -d jellyfin -f sql\diagnostics.sql > diagnostics_week1.txt

Compare to today's results:

  • Are supplementary indexes being used more?
  • Has ItemValues improved?

Step 3: Optimize ItemValues Table (Next Week)

After we see actual usage patterns, create targeted indexes for ItemValues.


📊 Why Supplementary Indexes Show 0 Uses

Your diagnostics show:

  • 0 active database connections
  • 0 long-running queries
  • Index usage from past activity only

This means:

  • Database has been idle
  • Indexes only get used when queries run
  • Need to use Jellyfin to generate workload

It's like installing a highway but nobody's driven on it yet! 🛣️


🔧 I Already Fixed One Thing

Updated Statistics - Ran ANALYZE so PostgreSQL knows about the new indexes


📅 1-Week Testing Plan

Day Action Expected Result
Day 1-2 Use Jellyfin normally
- Browse libraries
- Filter by genre
- View Recently Added
Generate query workload
Day 3 Run diagnostics
sql\diagnostics.sql
See if indexes are used
Day 4-7 Continue using Jellyfin Build more usage data
Day 7 Run diagnostics again
Compare to today
Decide which indexes to keep

🎯 Success Metrics

After 1 week, you should see:

If Indexes Are Working:

  • idx_baseitems_datecreated_filtered: 100+ uses
  • idx_itemvaluesmap_itemvalueid_itemid: 50+ uses
  • ItemValues seq scans: Reduced from 226k

If Indexes Aren't Helping:

  • Still 0-10 uses after heavy use
  • Action: Remove unused indexes to save space
  • Create different indexes based on actual query patterns

🔥 The Real Problem: ItemValues Table

Your diagnostics show the biggest issue isn't what we optimized:

ItemValues Table:

  • 226,121 sequential scans
  • 1.3 BILLION rows read
  • Only 52% index usage
  • This is killing performance! 😱

Why Our Indexes Didn't Help: We created indexes for:

  • BaseItems (recently added, virtual items, folders)
  • ItemValuesMap (genre/tag mapping)
  • ActivityLogs (user activity)

But NOT for ItemValues itself!

Next Step: After seeing usage patterns, we'll create indexes specifically for ItemValues table.


🎓 What This Teaches Us

Index Creation Is Iterative:

  1. Phase 1: Create indexes based on schema analysis (Done)
  2. Phase 2: Test with real workload ← You are here
  3. Phase 3: Monitor what's used, remove what's not
  4. Phase 4: Create indexes for actual bottlenecks
  5. Phase 5: Repeat

You can't optimize until you have real data!


⚠️ Don't Panic About Low Usage

It's normal! Here's why:

  1. Database was idle - 0 connections when you ran diagnostics
  2. New indexes - Just created, haven't had time to prove themselves
  3. Need workload - Indexes only matter when queries run

Analogy: You installed a fire extinguisher. The fact it hasn't been used yet doesn't mean it's useless! 🧯


🚦 Quick Status Check

Done:

  • Supplementary indexes created
  • Statistics updated
  • Diagnostics analyzed

📋 To Do:

  1. Use Jellyfin normally this week
  2. Run diagnostics end of week
  3. Compare results
  4. Optimize ItemValues table
  5. Remove unused indexes after 30 days

💡 Pro Tip: Keep a Log

Create a simple log of your Jellyfin usage:

Day 1:
- Browsed Movies library (5 min)
- Filtered by Action genre (10 items viewed)
- Viewed Recently Added (scrolled through 20 items)

Day 2:
- Searched for actor "Tom Hanks" (15 results)
- Watched a movie
- Browsed TV Shows (10 min)

This helps correlate index usage with your actions!


🎉 Bottom Line

Your database is healthy! The issues are optimization opportunities, not critical errors.

Action Items:

  1. Statistics updated (done by me)
  2. Use Jellyfin normally for 1 week (your task)
  3. Run diagnostics next week (we'll do together)
  4. Optimize based on real data (next phase)

Keep calm and keep testing! 🚀

See DATABASE_ANALYSIS_REPORT.md for the complete technical analysis.