db2 улучшает производительность функции коалесценции

Вопрос:

Наша система имеет некоторые проблемы с производительностью в базе данных db2. Недавно мы обнаружили, что SQL может стоить слишком много времени для выполнения. Следующий пример – простой случай

select * from table1 a
inner join table2 b on a.code = coalesce(b.code2,b.code1);

Он стоит около 1 секунды, а если я заменил “coalesce (b.code2, b.code1)” на “b.code1”, он будет в 10 раз быстрее (добавление: table2.code2 имеет только нулевое значение).

В некотором сложном выражении это будет 40 секунд по сравнению с 1 секундой.

Но будет лучше, если есть способ повысить производительность при сохранении кода2 там, если в будущем он не будет нулевым. Я попытался создать индексы для каждого столбца, но, похоже, это не улучшилось. Я также попробовал некоторое выражение условия заменить функцию coalesce, и это стоит того же

Лучший ответ:

Все, кроме Equi-join, будет работать хуже, чем Equi-join; Несмотря на то, что вы используете оператор равенства, использование coalesce дисквалифицирует его как Equi-join.

У вас есть индекс на table2 (code2, code1)? Если нет, это, вероятно, поможет.

Вы можете попробовать объединение двух Equi-соединений

Первая мысль

select * from table1 a
inner join table2 b on a.code = b.code2
UNION ALL
select * from table1 a
inner join table2 b on a.code = b.code1 and b.code2 is NULL;

альтернативы

select * from table1 a
inner join table2 b on a.code = b.code2
UNION ALL
select * from table1 a
inner join table2 b on a.code = b.code1 
where b.code2 is NULL;

Использование UNION вместо UNION ALL заставляет DB удалять повторяющиеся строки.

select * from table1 a
inner join table2 b on a.code = b.code2
UNION
select * from table1 a
inner join table2 b on a.code = b.code1;

Следующий индекс может или не может быть полезен (в зависимости от используемого оператора и данных):

  • table2 (code2)
  • table2 (code1)
  • table2 (code1, code2)
Оцените статью
TechArks.Ru
Добавить комментарий