У меня есть месячная секционированная таблица в Oracle по столбцу отметки времени. Эта таблица содержит> 1 млрд строк из данных истории 2019 года. Теперь я хочу отфильтровать эту таблицу, чтобы получить все результаты за определенный c день, относительно части HH24:MI:SS
.
Проблема (# 1), с которой я сталкиваюсь, заключается в том, что при использовании TO_CHAR(TIMESTAMPCOLUMN, 'YYYY-MM-DD')
, время выполнения моих запросов увеличивается за последние месяцы. Пример:
SELECT * FROM BIG_PART_TABLE WHERE TO_CHAR(TIMESTAMPCOLUMN, 'YYYY-MM-DD') = '2019-01-01' -- 3 sec
SELECT * FROM BIG_PART_TABLE WHERE TO_CHAR(TIMESTAMPCOLUMN, 'YYYY-MM-DD') = '2019-02-01' -- 6 sec
SELECT * FROM BIG_PART_TABLE WHERE TO_CHAR(TIMESTAMPCOLUMN, 'YYYY-MM-DD') = '2019-12-01' -- 36 sec
Итак, я избавился от TO_CHAR
и начал фильтровать так:
SELECT * FROM BIG_PART_TABLE WHERE TIMESTAMPCOLUMN BETWEEN DATE '2019-01-01' AND DATE '2019-01-02' -- 0.032 sec
SELECT * FROM BIG_PART_TABLE WHERE TIMESTAMPCOLUMN BETWEEN DATE '2019-12-01' AND DATE '2019-12-02' -- 0.031 sec
Проблема (# 2) в том, что мне лень написать предложение BETWEEN
, за исключением того факта, что это увеличивает вероятность ошибок.
Наконец, я действительно хочу использовать эффективное предложение where для фильтрации моей таблицы, например:
SELECT * FROM BIG_PART_TABLE WHERE TIMESTAMPCOLUMN = DATE '2019-01-01'
Спасибо за все.