169 lines
5.5 KiB
Python
169 lines
5.5 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
Script to analyze current database indexes and identify optimization opportunities.
|
|
"""
|
|
|
|
import sqlite3
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
def analyze_database_indexes():
|
|
"""Analyze current database indexes and suggest optimizations."""
|
|
|
|
# Database path
|
|
db_path = Path(__file__).parent / "vfx_project_management.db"
|
|
|
|
if not db_path.exists():
|
|
print(f"Database file not found at {db_path}")
|
|
return False
|
|
|
|
try:
|
|
# Connect to database
|
|
conn = sqlite3.connect(str(db_path))
|
|
cursor = conn.cursor()
|
|
|
|
print("=== Current Database Schema Analysis ===\n")
|
|
|
|
# Get all tables
|
|
cursor.execute("SELECT name FROM sqlite_master WHERE type='table'")
|
|
tables = [row[0] for row in cursor.fetchall()]
|
|
|
|
for table in tables:
|
|
print(f"Table: {table}")
|
|
|
|
# Get table info
|
|
cursor.execute(f"PRAGMA table_info({table})")
|
|
columns = cursor.fetchall()
|
|
|
|
print(" Columns:")
|
|
for col in columns:
|
|
col_name, col_type, not_null, default, pk = col[1], col[2], col[3], col[4], col[5]
|
|
pk_str = " (PRIMARY KEY)" if pk else ""
|
|
print(f" - {col_name}: {col_type}{pk_str}")
|
|
|
|
# Get existing indexes
|
|
cursor.execute(f"PRAGMA index_list({table})")
|
|
indexes = cursor.fetchall()
|
|
|
|
if indexes:
|
|
print(" Existing Indexes:")
|
|
for idx in indexes:
|
|
idx_name, unique, origin = idx[1], idx[2], idx[3]
|
|
unique_str = " (UNIQUE)" if unique else ""
|
|
print(f" - {idx_name}{unique_str}")
|
|
|
|
# Get index details
|
|
cursor.execute(f"PRAGMA index_info({idx_name})")
|
|
idx_info = cursor.fetchall()
|
|
if idx_info:
|
|
cols = [info[2] for info in idx_info]
|
|
print(f" Columns: {', '.join(cols)}")
|
|
else:
|
|
print(" No indexes found")
|
|
|
|
print()
|
|
|
|
# Analyze foreign key relationships for index optimization
|
|
print("=== Foreign Key Analysis ===\n")
|
|
|
|
for table in tables:
|
|
cursor.execute(f"PRAGMA foreign_key_list({table})")
|
|
fks = cursor.fetchall()
|
|
|
|
if fks:
|
|
print(f"Table: {table}")
|
|
for fk in fks:
|
|
from_col, to_table, to_col = fk[3], fk[2], fk[4]
|
|
print(f" FK: {from_col} -> {to_table}.{to_col}")
|
|
print()
|
|
|
|
return True
|
|
|
|
except sqlite3.Error as e:
|
|
print(f"Database error: {e}")
|
|
return False
|
|
except Exception as e:
|
|
print(f"Unexpected error: {e}")
|
|
return False
|
|
finally:
|
|
if conn:
|
|
conn.close()
|
|
|
|
def suggest_index_optimizations():
|
|
"""Suggest additional indexes for performance optimization."""
|
|
|
|
print("=== Suggested Index Optimizations ===\n")
|
|
|
|
suggestions = [
|
|
{
|
|
"table": "tasks",
|
|
"index": "idx_tasks_assigned_user",
|
|
"columns": ["assigned_user_id"],
|
|
"reason": "Optimize queries filtering tasks by assigned user"
|
|
},
|
|
{
|
|
"table": "tasks",
|
|
"index": "idx_tasks_status",
|
|
"columns": ["status"],
|
|
"reason": "Optimize queries filtering tasks by status"
|
|
},
|
|
{
|
|
"table": "tasks",
|
|
"index": "idx_tasks_type",
|
|
"columns": ["task_type"],
|
|
"reason": "Optimize queries filtering tasks by type"
|
|
},
|
|
{
|
|
"table": "submissions",
|
|
"index": "idx_submissions_created_at",
|
|
"columns": ["created_at"],
|
|
"reason": "Optimize queries ordering submissions by creation date"
|
|
},
|
|
{
|
|
"table": "activities",
|
|
"index": "idx_activities_entity",
|
|
"columns": ["entity_type", "entity_id"],
|
|
"reason": "Optimize activity queries by entity"
|
|
},
|
|
{
|
|
"table": "activities",
|
|
"index": "idx_activities_created_at",
|
|
"columns": ["created_at"],
|
|
"reason": "Optimize activity feed queries by date"
|
|
},
|
|
{
|
|
"table": "shots",
|
|
"index": "idx_shots_episode",
|
|
"columns": ["episode_id"],
|
|
"reason": "Optimize queries filtering shots by episode"
|
|
},
|
|
{
|
|
"table": "assets",
|
|
"index": "idx_assets_project",
|
|
"columns": ["project_id"],
|
|
"reason": "Optimize queries filtering assets by project"
|
|
},
|
|
{
|
|
"table": "tasks",
|
|
"index": "idx_tasks_composite",
|
|
"columns": ["shot_id", "asset_id", "status"],
|
|
"reason": "Optimize complex queries filtering by parent and status"
|
|
}
|
|
]
|
|
|
|
for suggestion in suggestions:
|
|
print(f"Table: {suggestion['table']}")
|
|
print(f" Suggested Index: {suggestion['index']}")
|
|
print(f" Columns: {', '.join(suggestion['columns'])}")
|
|
print(f" Reason: {suggestion['reason']}")
|
|
print()
|
|
|
|
if __name__ == "__main__":
|
|
print("Database Index Analysis Tool")
|
|
print("=" * 50)
|
|
|
|
if analyze_database_indexes():
|
|
suggest_index_optimizations()
|
|
else:
|
|
print("Failed to analyze database")
|
|
sys.exit(1) |