Я использую процедуру PL SQL для агрегирования данных с 4 серверов в одно место, и ее производительность на одном из серверов значительно ниже.
У меня есть этот относительно простой запрос для сбора данных из журнала аудита:
Индексы в порядке, объем строк на четвертом сервере немного больше, но не для того, чтобы вызывать эту разницу, такое же оборудование, тот же Linux, та же версия Oracle (Oracle 11.2.0.4.0), та же структура таблицы и индексов. Индексы могут использоваться, одинаковое разбиение.
INSERT INTO app_stats_agg_hourly (SHIPMENTS, event_datetime, COUNTRY, data_type, event_type, collection_time, INSTANCE)
SELECT COUNT(*) as SHIPMENTS, TRUNC(event_datetime,'HH24') as event_datetime,COUNTRY,data_type,event_type,load_run_start,v_region
FROM APP_AUDIT
WHERE
event_type in ('FromApp','ToError','ToApp','Generate','FromCorr')
and event_datetime > last_collection
and event_datetime <= last_event
GROUP BY TRUNC(event_datetime,'HH24'),COUNTRY,data_type,event_type;
Работает хорошо и точно, как и ожидалось. Переменные last_collection
и last_event
инициализируются ранее в процедуре.
Этот код выполняется в течение минуты или двух на 3 из 4 серверов и полчаса на четвертом.
После долгого исследования я обнаружил, что я использую переменные TIMESTAMPS, а в столбце event_datetime указывается дата. Если я использую дату, это работает как шарм. Мой вопрос - что заставляет это работать по-другому?