Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
db2 9.7 проблема с доступом по индексу
|
|||
|---|---|---|---|
|
#18+
Всем привет, только начал разбираться c db2 (до этого работал исключительно с Oracle) Имеется серверное Java-приложение (менять код нет возможности), которое обращается к db2 9.7 на Linux. В нем генерируются запросы к базе вида: Код: sql 1. При этом в sometable уже присутствует колонка upper_value = upper(value), заполняемая приложением, и индекс по ней. Указанный запрос по индексу идти не хочет (откуда ему знать, что upper_value суть upper(value)), соответственно жуткие тормоза. Пока понятно, что правильнее было бы доработать приложение, чтобы оно в текст запроса вместо upper(value) вставляло бы upper_value, но интересует наличие возможности решить эту проблему с тормозами без изменения приложения (в Oracle я бы это сделал через функциональные индексы/виртуальные колонки/управление планом запроса) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2013, 21:31 |
|
||
|
db2 9.7 проблема с доступом по индексу
|
|||
|---|---|---|---|
|
#18+
new in db2, Здравствуйте. Каким образом приложение работает с полем upper_value? Заполняет его только при вставке или при изменении поля value тоже? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2013, 10:08 |
|
||
|
db2 9.7 проблема с доступом по индексу
|
|||
|---|---|---|---|
|
#18+
Mark Barinstein, Исходных кодов нет (только трассы), но после редактирования записи upper_value в базе меняется. Из чего можно сделать предположение, что там идет update обоих полей (кстати, Оракл на этом бы и споткнулся, если upper_value определить как виртуальную колонку) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2013, 11:02 |
|
||
|
db2 9.7 проблема с доступом по индексу
|
|||
|---|---|---|---|
|
#18+
new in db2, если поле сделано как generated always - то индекс автоматом подхватится. Если поле заполняется приложением/триггером - то откуда оптимизатору об этом узнать? Andy ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2013, 11:23 |
|
||
|
db2 9.7 проблема с доступом по индексу
|
|||
|---|---|---|---|
|
#18+
В Оракле можно было бы создать дополнительный функциональный индекс по upper(value), и он бы подхватился оптимизатором. Можно ли в db2 сделать подобное? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2013, 11:27 |
|
||
|
db2 9.7 проблема с доступом по индексу
|
|||
|---|---|---|---|
|
#18+
new in db2, Вы всё же проверьте, может, это поле триггерами ведётся? Если действительно приложением, то надо будет гораздо больше изменений с таблицей сделать... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2013, 12:18 |
|
||
|
db2 9.7 проблема с доступом по индексу
|
|||
|---|---|---|---|
|
#18+
Mark Barinstein, Триггеров на этой таблице нет (к сожалению) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2013, 13:10 |
|
||
|
db2 9.7 проблема с доступом по индексу
|
|||
|---|---|---|---|
|
#18+
New in db2Триггеров на этой таблице нет (к сожалению) Тогда вам надо будет сделать следующее: - переименовать таблицу, скажем, в sometable_t Для этого может понадобиться удаление и пересоздание после RENAME некоторых зависящих от таблицы объектов. - изменить тип поля Код: sql 1. 2. 3. - создать представление Код: sql 1. - создать пару триггеров на представление Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. В триггерах вы перечисляете все поля таблицы, которые не генерируются (не identity / generated). Поле upper_value у вас теперь генерируется автоматически, и вы его в списке не указываете. PK здесь схематично - поля первичного ключа или уникального индекса. Теперь, если у вас уже есть индекс по upper_value, то он должен использоваться в плане запроса. Такое изменение может повлиять на результат запросов типа: Код: sql 1. 2. 3. 4. если у вас они используются - вы не получите значения генерируемых полей для new и получите ошибку для final. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2013, 15:32 |
|
||
|
db2 9.7 проблема с доступом по индексу
|
|||
|---|---|---|---|
|
#18+
Mark Barinstein, Спасибо большое - идею понял - заменить хранимое поле на вычисляемое и исключить возможность попытки записи в это поле через view с instead-of триггерами. Кстати, не будет ли тормозов на массовых insert/update во view из-за триггеров? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2013, 15:49 |
|
||
|
db2 9.7 проблема с доступом по индексу
|
|||
|---|---|---|---|
|
#18+
New in db2Кстати, не будет ли тормозов на массовых insert/update во view из-за триггеров?Не могу сказать, не пробовал никогда на больших объёмах сравнивать. В данном случае, конечно, лучше приложение изменить так, чтоб оно не лезло изменять это поле... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2013, 16:03 |
|
||
|
db2 9.7 проблема с доступом по индексу
|
|||
|---|---|---|---|
|
#18+
Mark Barinstein, Временно сделал так - добавил в таблицу вычисляемое поле - upper(value) и построил индекс по нему. Все сразу залетало. Расплата - избыточный лишний индекс, но нет рисков из-за подмены таблицы на view. Пока разработчики за несколько месяцев поправят, поживем так. Спасибо за помощь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2013, 19:12 |
|
||
|
|

start [/forum/topic.php?fid=43&fpage=36&tid=1601508]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
38ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
38ms |
get tp. blocked users: |
2ms |
| others: | 291ms |
| total: | 412ms |

| 0 / 0 |
