powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / db2 9.7 проблема с доступом по индексу
11 сообщений из 11, страница 1 из 1
db2 9.7 проблема с доступом по индексу
    #38180473
new in db2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет,

только начал разбираться c db2 (до этого работал исключительно с Oracle)

Имеется серверное Java-приложение (менять код нет возможности), которое обращается к db2 9.7 на Linux.

В нем генерируются запросы к базе вида:
Код: sql
1.
select * from sometable  where ... and upper(value)='ЛИТЕРАЛ'


При этом в sometable уже присутствует колонка upper_value = upper(value), заполняемая приложением, и индекс по ней.

Указанный запрос по индексу идти не хочет (откуда ему знать, что upper_value суть upper(value)), соответственно жуткие тормоза.
Пока понятно, что правильнее было бы доработать приложение, чтобы оно в текст запроса вместо upper(value) вставляло бы upper_value, но интересует наличие возможности решить эту проблему с тормозами без изменения приложения (в Oracle я бы это сделал через функциональные индексы/виртуальные колонки/управление планом запроса)
...
Рейтинг: 0 / 0
db2 9.7 проблема с доступом по индексу
    #38180831
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
new in db2,

Здравствуйте.

Каким образом приложение работает с полем upper_value?
Заполняет его только при вставке или при изменении поля value тоже?
...
Рейтинг: 0 / 0
db2 9.7 проблема с доступом по индексу
    #38180901
new in db2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mark Barinstein,

Исходных кодов нет (только трассы), но после редактирования записи upper_value в базе меняется. Из чего можно сделать предположение, что там идет update обоих полей (кстати, Оракл на этом бы и споткнулся, если upper_value определить как виртуальную колонку)
...
Рейтинг: 0 / 0
db2 9.7 проблема с доступом по индексу
    #38180946
A.Panskikh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
new in db2,

если поле сделано как generated always - то индекс автоматом подхватится. Если поле заполняется приложением/триггером - то откуда оптимизатору об этом узнать?

Andy
...
Рейтинг: 0 / 0
db2 9.7 проблема с доступом по индексу
    #38180952
new in db2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В Оракле можно было бы создать дополнительный функциональный индекс по upper(value), и он бы подхватился оптимизатором.
Можно ли в db2 сделать подобное?
...
Рейтинг: 0 / 0
db2 9.7 проблема с доступом по индексу
    #38181046
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
new in db2,

Вы всё же проверьте, может, это поле триггерами ведётся?
Если действительно приложением, то надо будет гораздо больше изменений с таблицей сделать...
...
Рейтинг: 0 / 0
db2 9.7 проблема с доступом по индексу
    #38181164
New in db2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mark Barinstein,

Триггеров на этой таблице нет (к сожалению)
...
Рейтинг: 0 / 0
db2 9.7 проблема с доступом по индексу
    #38181498
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
New in db2Триггеров на этой таблице нет (к сожалению)
Тогда вам надо будет сделать следующее:

- переименовать таблицу, скажем, в sometable_t
Для этого может понадобиться удаление и пересоздание после RENAME некоторых зависящих от таблицы объектов.

- изменить тип поля
Код: sql
1.
2.
3.
set integrity for sometable_t off;
alter table sometable_t alter upper_value set generated always as (upper(value));
set integrity for sometable_t immediate checked force generated;


- создать представление
Код: sql
1.
create view sometable as select * from sometable_t;


- создать пару триггеров на представление
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
create trigger sometable_ii
instead of insert on sometable
referencing new as n
for each row
insert into sometable_t (c1, ..., cN) values (n.c1, ..., n.cN);

create trigger sometable_iu
instead of update on sometable
referencing new as n old as o
for each row
update sometable_t t set (c1, ..., cN) = (n.c1, ..., n.cN) where t.PK=o.PK;


В триггерах вы перечисляете все поля таблицы, которые не генерируются (не identity / generated).
Поле upper_value у вас теперь генерируется автоматически, и вы его в списке не указываете.
PK здесь схематично - поля первичного ключа или уникального индекса.

Теперь, если у вас уже есть индекс по upper_value, то он должен использоваться в плане запроса.
Такое изменение может повлиять на результат запросов типа:
Код: sql
1.
2.
3.
4.
select *
from [new | final] table(
insert into sometable (...) ...
);

если у вас они используются - вы не получите значения генерируемых полей для new и получите ошибку для final.
...
Рейтинг: 0 / 0
db2 9.7 проблема с доступом по индексу
    #38181533
New in db2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mark Barinstein,

Спасибо большое - идею понял - заменить хранимое поле на вычисляемое и исключить возможность попытки записи в это поле через view с instead-of триггерами.

Кстати, не будет ли тормозов на массовых insert/update во view из-за триггеров?
...
Рейтинг: 0 / 0
db2 9.7 проблема с доступом по индексу
    #38181567
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
New in db2Кстати, не будет ли тормозов на массовых insert/update во view из-за триггеров?Не могу сказать, не пробовал никогда на больших объёмах сравнивать.
В данном случае, конечно, лучше приложение изменить так, чтоб оно не лезло изменять это поле...
...
Рейтинг: 0 / 0
db2 9.7 проблема с доступом по индексу
    #38181946
new in db2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mark Barinstein,

Временно сделал так - добавил в таблицу вычисляемое поле - upper(value) и построил индекс по нему. Все сразу залетало.
Расплата - избыточный лишний индекс, но нет рисков из-за подмены таблицы на view.

Пока разработчики за несколько месяцев поправят, поживем так.

Спасибо за помощь.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / db2 9.7 проблема с доступом по индексу
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]