CREATE INDEX idx_movements_user_date ON movements (user_id, date DESC);
CREATE INDEX idx_movements_user_type ON movements (user_id, type);
CREATE INDEX idx_transfers_user_date ON transfers (user_id, date DESC);
CREATE INDEX idx_categories_user_type ON categories (user_id, type);
CREATE INDEX idx_accounts_user ON accounts (user_id);
-- GOOD: Multi-row insert for installment purchases
INSERT INTO movements (user_id, type, date, amount, account_id, category_id, installment_purchase_id, installment_number, total_installments)
VALUES
($1, 'expense', $2, $3, $4, $5, $6, 1, $7),
($1, 'expense', $2 + interval '1 month', $3, $4, $5, $6, 2, $7);
-- Find unindexed foreign keys
SELECT conrelid::regclass, a.attname
FROM pg_constraint c
JOIN pg_attribute a ON a.attrelid = c.conrelid AND a.attnum = ANY(c.conkey)
WHERE c.contype = 'f'
AND NOT EXISTS (
SELECT 1 FROM pg_index i
WHERE i.indrelid = c.conrelid AND a.attnum = ANY(i.indkey)
);
-- Find slow queries
SELECT query, mean_exec_time, calls
FROM pg_stat_statements
WHERE mean_exec_time > 100
ORDER BY mean_exec_time DESC;