Как оптимизировать преобразование даты в Oracle SQL

У меня есть столбец даты CUR_DATE в типе данных NUMBER (10) (20210821) в БД, и когда я запускаю некоторые выполнения с преобразованием, у меня возникают очень серьезные проблемы со временем работы.

напр. Мне нужно получить данные за последние 2 месяца с текущего дня, поэтому я использую подобное преобразование в своем предложении WHERE:

and trunc(to_date(CUR_DATE,'yyyymmdd'),'mm') >= add_months(trunc(sysdate,'mm'),-1)

и если я не меняю тип даты, конечно, он работает быстрее

and CUR_DATE >= 20220201

Так что, может быть, будет решение, которое позволит мне выполнять данные за последние два месяца?

Сохранение значения даты в числовом столбце (или, что еще хуже, в varchar) — плохая идея. Проблема с производительностью, которая у вас есть, является прямым результатом этого.

a_horse_with_no_name 17.03.2022 13:35
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
1
31
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Сделайте наоборот:

and cur_date >= to_number(to_char(add_months(trunc(sysdate, 'mm'), -1), 'yyyymmdd'))

если вы должны. Почему? Потому что, я полагаю, в столбце cur_date есть индекс. Когда вы возиться с этим (применяете различные функции), индекс больше не используется. Однако вы мог создаете индекс на основе функций.

SQL> select to_number(to_char(add_months(trunc(sysdate, 'mm'), -1), 'yyyymmdd')) val from dual;

       VAL
----------
  20220201

SQL>

Что вам действительно нужно сделать, так это хранить даты в столбцах типа DATE, а не NUMBER.

похоже, это может быть мое решение, и да, способ хранения БД в беспорядке. в любом случае большое спасибо за ваше предложение - не думал об этом

Kurasao 17.03.2022 14:23

Другие вопросы по теме