Прежде всего UNION
- это дорогостоящая операция, которая не только склеивает два результата вместе, но и ищет дубликаты для удаления. Вместо этого вы хотите UNION ALL
, который выполняет только склеивание, потому что ваши запросы не дают дубликатов (поскольку tittle
отличается).
Тогда в столбце date_time
должны быть индексы плюс сумма столбец для каждой таблицы:
create index idx1 on vw_break_time_exceeding45 (date_time, "COUNT");
create index idx2 on VW_BREAK_TIME_DOUBLEBREAK (date_time, cnt);
create index idx3 on VW_BREAK_TIME_FREQUENTBREAK (date_time, "COUNT");
create index idx4 on VW_BREAK_TIME_PROD_TIMEIN (date_time, remarks);
create index idx5 on VW_BREAK_TIME_PROD_TIMEOUT (date_time, remarks);
Я бы также добавил следующие индексы для случая remarks
более избирательно, чем date_time
. (Вы всегда можете проверить план объяснения запроса и удалить индексы, которые не используются.)
create index idx6 on VW_BREAK_TIME_PROD_TIMEIN (remarks, date_time);
create index idx7 on VW_BREAK_TIME_PROD_TIMEOUT (remarks, date_time);
Вы должны не Count(REMARKS)
, а COUNT(*)
, поскольку вы хотите только считать строки; REMARKS
никогда не может быть нулевым из-за вашего условия WHERE
. Но я предполагаю, что оптимизатор видит это, и вы не получаете скорость, только удобочитаемость.
Два примечания:
- Литерал даты выглядит так:
DATE '2020-03-31'
. Используйте их вместо манипуляции со строками. "COUNT"
- зарезервированное SQL слово. Я бы не использовал его для названия столбца.