более быстрый способ возврата процесса

#sql #oracle #performance #query-optimization

#sql #Oracle #Производительность #оптимизация запросов

Вопрос:

Я хочу вернуть последний заданный паспорт из базы данных. В Table1 есть только одна паспортная информация. В Table2 есть вся паспортная информация, принадлежащая каждому человеку.

Мой сравнивающий код работает очень медленно, это занимает слишком много времени. Итак, если есть какой-либо более быстрый альтернативный код для моего кода, пожалуйста, поделитесь им, пожалуйста.

   from table1 t
 where t.pass_date <
       (select max(tb_datebeg) from table2 where tb_inn = t.tin)
  

Ответ №1:

Мы могли бы сформулировать это как объединение вместе с аналитическими функциями:

 WITH cte AS (
    SELECT t1.*, MAX(t2.tb_datebeg) OVER (PARTITION BY t2.tb_inn) max_tb_datebeg
    FROM table1 t1
    INNER JOIN table2 t2 ON t2.tb_inn = t1.tin
)

SELECT *
FROM cte
WHERE pass_date < max_tb_datebeg;
  

Приведенный выше запрос выиграет от следующего индекса на table2 :

 CREATE INDEX idx2 ON table2 (tb_inn, tb_datebeg);
  

Комментарии:

1. 20 минут не дали результата.

2. Насколько велики ваши таблицы? Вы действительно добавили индекс, который я предложил?

3. в чем преимущество этого индекса; Помогите разобраться

4. Создает ли это столбец с именем tb_inn tb_datebeg

5. Индекс может ускорить запрос. Это вообще не изменяет структуру вашей исходной таблицы.