#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. Индекс может ускорить запрос. Это вообще не изменяет структуру вашей исходной таблицы.