Как правило, оптимальным индексом для запроса является индексирование всего в предложении where
в порядке уменьшения селективности, а затем всего в order by
в порядке уменьшения селективности, а затем всего того, что вы выбираете, но еще не выбрали индексируются. Это означает, что вы будете когда-либо использовать индекс, а не таблицу за ним.
Однако этот метод может быть совершенно нелепым. Вам решать, как далеко вы хотите пойти.
Selective
означает количество значений в индексе в процентах от общего числа строк. Как правило, чем больше значений в столбце, тем быстрее он будет найден в индексе. Я говорю, как правило, поскольку всегда исключений для каждого правила.
Если, например, rule_pk
является первичным ключом вашей таблицы, то, вероятно, будет достаточно индексировать этот столбец. Это будет означать, что вы выполняете уникальное сканирование индекса с последующим доступом к таблице по rowid.
Продолжая предполагать, что rule_pk
является первичным ключом, start_time_local
почти уникален, а остальные столбцы одинаково избирательны, индекс оптимальный будет выглядеть примерно так:
(rule_pk, start_time_local, type_pk, this_.name, start_time_gmt, my_table_id)
. Это довольно смешно.
Я бы предложил прочитать эту часть документации о том, как читать объяснения планов и регулярно их использовать.
Также не забудьте собрать статистику после создания индекса, так как это может иметь большое значение:
dbms_stats.gather_table_stats( 'SCHEMA_NAME'
, 'TABLE_NAME'
, cascade => True
, method_opt => 'FOR ALL INDEXED COLUMNS'
);
должно быть достаточно.