Оптимизировать запрос с помощью столбца NULLable в Oracle - PullRequest
0 голосов
/ 07 июня 2011

Есть ли способ оптимизировать следующий запрос?Он возвращает правильные записи, но его выполнение занимает более минуты.

select STATUS, SUBNO, TRUNC(TRSF_DATE) TRSF_DATE
from
(
    select STATUS, SUBNO, TRUNC(TRSF_DATE) TRSF_DATE
    from tbl        where 
       trsf_date is not null and
       contrno in ('8', '8A', '8B', '8C', '8D', '8E', '8PH3A', '8PH3B', '8PH3C', '8PHD')
)
where trsf_date = to_date('5/21/2011', 'mm/dd/yyyy')**

Требуется вернуть записи, где:

  1. contrno in ('8', '8A', '8B', '8C', '8D', '8E', '8PH3A', '8PH3B', '8PH3C', '8PHD')
  2. trsf_date = некоторая конкретная дата

Обратите внимание, что столбец trsf_date имеет значение NULLable , и я должен использовать trsf_date в предложении WHERE.Вот почему я использовал внутренний запрос, чтобы сначала получить строки NOT NULL, а затем выбрать строки из этого.В противном случае запрос застрянет и не вернет никаких строк.

Ответы [ 3 ]

2 голосов
/ 07 июня 2011

СУБД обрабатывают NULL как unknown при соблюдении ANSI.Это означает, что выражение типа Column = /value/ автоматически исключит NULL без дальнейших условий.Поэтому следующий упрощенный запрос должен выполнить эту работу:

SELECT
   STATUS,
   SUBNO,
   TRUNC(TRSF_DATE) TRSF_DATE
FROM crm_user_info
WHERE
   TRSF_DATE = To_Date('5/21/2011', 'mm/dd/yyyy')
   AND CONTRNO IN ('8', '8A', '8B', '8C', '8D', '8E', '8PH3A', '8PH3B', '8PH3C', '8PHD')

Чтобы ускорить это, вы можете поместить индексы в столбцы TRSF_DATE и CONTRNO.

0 голосов
/ 07 июня 2011
select STATUS, SUBNO, TRSF_DATE
from crm_user_info
where isnull(trsf_date,'01/Jan/1753') = '07/Jun/2011'
and contrno in ('8', '8A', '8B', '8C', '8D', '8E', '8PH3A', '8PH3B', '8PH3C', '8PHD') 
0 голосов
/ 07 июня 2011

Вам не нужен внутренний запрос.Вы можете объединить условия WHERE в 1 запрос:

select STATUS, SUBNO, TRUNC(TRSF_DATE) TRSF_DATE
    from crm_user_info
    where 
       trsf_date is not null and
       trsf_date = to_date('5/21/2011', 'mm/dd/yyyy') and
       contrno in ('8', '8A', '8B', '8C', '8D', '8E', '8PH3A', '8PH3B', '8PH3C', '8PHD')

Также, чтобы ускорить запрос, вы можете использовать подсказки запроса, такие как WITH(NOLOCK) в SQL Server:

select STATUS, SUBNO, TRUNC(TRSF_DATE) TRSF_DATE
        from crm_user_info WITH(NOLOCK)
...