как сделать быстрый запрос - PullRequest
0 голосов
/ 07 марта 2019

Я тестировал этот код SQL для создания маленькой таблицы, в нем 4 строки данных, и я получаю быстрый запрос, но когда я переключаюсь на истинную таблицу с глубоким временем и не даю никакого результата, эта таблица истинности содержит более 1 миллиона записей

SELECT DISTINCT /*+ richs_secret_hint */
 em_code, (to_date(end_date,'DD-MM-YYYY') - level + 1) AS days
FROM
   islaam_vca where em_code = '2222'

CONNECT BY level <= (to_date(end_date,'DD-MM-YYYY') - to_date(start_date,'DD-MM-YYYY') + 1)
order by days ASC
;

дай мне быстрый результат

любой поможет мне, как получить быстрый результат из истинной таблицы

1 Ответ

0 голосов
/ 07 марта 2019
  1. Мне кажется, что комбинация em_code и start_date является уникальной для этой таблицы, поэтому для этой уникальности должен существовать индекс:
CREATE UNIQUE INDEX islaam_vca_uk1 ON islaam_vca(em_code, start_date)
  1. Во-вторых, пожалуйста, сохраняйте даты как тип данных DATE, а не как строку.

  2. Протестировал это немного, и может возникнуть ситуация, когда запрос будет пытаться использовать TABLE ACCESS FULL для таблицы islaam_vca, поэтому вы можете попытаться сделать:

SELECT /*+ALL_ROWS*/  distinct em_code --sorry about my interpretation of secret your hint
     , start_date
     , NVL(end_date, SYSDATE) end_date --don't know if end date is nullable or now
     , TRUNC(start_date) + level - 1 specific_date
  FROM (SELECT em_code
            , start_date
            , end_date
         FROM islaam_vca
        WHERE em_code = '2222')
CONNECT BY level <= TRUNC(NVL(end_date, SYSDATE)) - TRUNC(start_date) + 1
order by specific_date;
...