выполнение запроса занимает больше времени, даже если индекс создан - PullRequest
1 голос
/ 06 февраля 2020

У меня есть таблица DB_TBL, где исторические данные вставляются из инструмента 5-го числа каждого месяца. В качестве исторических данных количество вставленных строк очень велико. Например, я проверил счет за этот месяц и его 1626521.

Эта таблица содержит 50 столбцов. Но мне интересно проверить только 5 столбцов. Есть gui от внешнего интерфейса, который использует эти 5 столбцов и где я предоставляю фильтр для получения данных за один месяц каждый раз, например, за предыдущий месяц как closure_date между 01.01.2020 и 31.01.2020.

Select Client_key, Portfolia_Name, Closure_date, 
    Currency_Type, Balance from DB_TBL        
    where CLOSURE_DATE between 
    to_date ('01.01.2020','dd.mm.yyyy') and to_date ('31.01.2020','dd.mm.yyyy');

Этот запрос очень медленный и выполняется более 30 минут. Эта проблема очень критична, как и та же проблема, с которой я столкнулся в gui. Я предоставил индекс для Closure_date столбца. Но все же это не улучшает производительность.

Есть ли способ улучшить производительность запросов? Может быть, я могу создать Virtual based index или создать View?

1 Ответ

1 голос
/ 06 февраля 2020

Во-первых, я бы написал запрос, используя литералы даты:

Select Client_key, Portfolia_Name, Closure_date, Currency_Type, Balance
from DB_TBL
where CLOSURE_DATE between date '2020-01-01' and date '2020-01-31'

Для этого запроса вы хотите индекс на db_tbl(closure_date). Если у вас уже есть этот индекс, то, вероятно, у вас такой большой объем данных, что для его возврата требуется много времени. Вы можете изменить индекс на индекс покрытия, включив остальные столбцы в индекс (после CLOSURE_DATE, который должен быть первым).

Тем не менее, если вам нужны все данные с января 2020 года, я рекомендовал бы:

where CLOSURE_DATE >= date '2020-01-01' and
      CLOSURE_DATE < date '2020-02-01'

Это вернет все строки, даже те, которые имеют компонент времени. Это особенно важно в Oracle, потому что тип данных date может иметь компонент времени - даже если пользовательские интерфейсы часто показывают только дату.

...