Низкая производительность при объединении оператора join и where - PullRequest
0 голосов
/ 04 июня 2018

У меня проблема при объединении 2 таблиц и использовании даты в предложении where.
Запрос № 1 выполняется много лет
Запрос № 2 выполняется нормально (без объединения)
Запрос № 3 выполняется нормально(нет условия where)

Код

Query 1 
    select    t1.id 
    from      t1
    inner     join t2
    on        t1.id = t2.inst_id
    where     t1.change_date >= to_date('04-06-2018', 'DD-MM-YYYY')
    ; -- does not work

Query 2
    select    t1.id 
    from      t1
    --inner     join t2
    --on        t1.id = t2.inst_id
    where     t1.change_date >= to_date('04-06-2018', 'DD-MM-YYYY')
    ; -- work in < 1s


Query 3 
    select    t1.id 
    from      t1
    inner     join t2
    on        t1.id = t2.inst_id
    --where     t1.change_date >= to_date('04-06-2018', 'DD-MM-YYYY')
    ; -- works in < 1s

Знаете ли вы, почему сочетание объединения и предложения where с датой является проблематичным?

1 Ответ

0 голосов
/ 04 июня 2018

Без вашей структуры таблиц / индексов / статистики я мог бы только предложить проверить:

WITH cte AS (
  SELECT /*+materialize*/ t1.id  
  FROM t1
  WHERE t1.change_date >= to_date('04-06-2018', 'DD-MM-YYYY')
)
SELECT *
FROM cte c
JOIN t2
  ON c.id = t2.inst_id;

РЕДАКТИРОВАТЬ :

Более правильный подход - добавитьрасширенная статистика:

select  dbms_stats.create_extended_stats(null,'t1','(id, change_date)')
from dual;
...