На основании запроса, как узнать, какие индексы добавить?
Есть ли какой-нибудь инструмент, который делает это? Вы даете ему запрос SQL, и он дает предложения. Например, я пытаюсь оптимизировать следующий запрос:
Load (383.2ms) SELECT COUNT(*) as plays, p.chosen_race as race, p.won as won, r.game_type as type FROM plays p, replays r WHERE p.replay_id = r.id AND r.is_public = 't' AND r.winner_known = 't' GROUP BY r.game_type, p.chosen_race, p.won ORDER BY r.game_type, p.chosen_race
EXPLAIN
Aggregate (cost=8389.92..8389.93 rows=1 width=4)
-> Hash Left Join (cost=3570.69..8150.84 rows=95630 width=4)
Hash Cond: (replays.id = players_replays_join.replay_id)
-> Hash Left Join (cost=1785.34..3772.35 rows=38995 width=4)
Hash Cond: (replays.id = plays.replay_id)
-> Seq Scan on replays (cost=0.00..833.02 rows=15901 width=8)
Filter: (is_public AND ((state)::text = 'success'::text))
-> Hash (cost=1110.82..1110.82 rows=41082 width=4)
-> Seq Scan on plays (cost=0.00..1110.82 rows=41082 width=4)
-> Hash (cost=1110.82..1110.82 rows=41082 width=8)
-> Seq Scan on plays players_replays_join (cost=0.00..1110.82 rows=41082 width=8)
Как мы должны интерпретировать этот результат?
1 ответ
Вам нужны данные в таблицах.
Тогда вы можете использовать EXPLAIN ANALYZE
http://www.postgresql.org/docs/9.0/interactive/using-explain.html
Вы можете добавлять и удалять индексы и сравнивать время.