powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Можно ли оптимизировать запросик?
7 сообщений из 7, страница 1 из 1
Можно ли оптимизировать запросик?
    #32558111
kostya0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Запросик сильно подвешивает систему. Есть более быстрые варианты?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
update  db2admin.tmpTrace  
SET To = coalesce( 
   (select UserName from db2admin.People  where lcase(TO)=ShortName FETCH FIRST  1  ROWS ONLY),  
   (select UserName from db2admin.People  where lcase(TO)=INetAddr FETCH FIRST  1  ROWS ONLY), 
   (select UserName from db2admin.People  where lcase(TO)=Fam FETCH FIRST  1  ROWS ONLY), 
   TO) 
where To<>''  AND to not like '%/%' AND to not in (select UserName from db2admin.People)


2 таблицы.
1. People - содержит список сотрудников (4000 записей) с полями :
UserName - полное имя
ShortName, INetAddr, Fam - различные алиасы этого человека

2. tmpTrace 500 000 записей. Примерно половина соответствует условию WHERE данного запроса.

Задача - поле TO привести к единому формату заменив там все алиасы на полный UserName.

Некоторые пояснения по запросу
1. "FETCH FIRST 1 ROWS ONLY" введено на всякий случай. В принципе такого быть не должно но однажды было. Может MAX или MIN будет быстрее?

2. Условие " not like '%/%' " отсекает имена не нужного формата
...
Рейтинг: 0 / 0
Можно ли оптимизировать запросик?
    #32558254
Фотография riman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
можно not in заменить на not exists.
...
Рейтинг: 0 / 0
Можно ли оптимизировать запросик?
    #32558305
kostya0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
так?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
update  db2admin.tmpTrace  t1 
SET To = coalesce( 
   (select UserName from db2admin.People  where lcase(TO)=ShortName FETCH FIRST  1  ROWS ONLY),  
   (select UserName from db2admin.People  where lcase(TO)=INetAddr FETCH FIRST  1  ROWS ONLY), 
   (select UserName from db2admin.People  where lcase(TO)=Fam FETCH FIRST  1  ROWS ONLY), 
   TO) 
where To<>''  AND to not like '%/%' AND  not exists (select UserName from db2admin.People t2 where t2.UserName=t1.UserName)

А смысл?
...
Рейтинг: 0 / 0
Можно ли оптимизировать запросик?
    #32558348
Фотография riman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
For Subquery - when using negation logic:
Use NOT Exists 
tip:DB2 tests non-existence
Instead of NOT IN
tip:DB2 must materialize the complete result set
...
Рейтинг: 0 / 0
Можно ли оптимизировать запросик?
    #32558440
kostya0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Откуда этот текст? Кукбуке не нашел.

Я решил отказаться от последовательного сравнения (что плохо но не смертельно), поэтому пришел к такому

Код: plaintext
1.
2.
3.
4.
5.
update  db2admin.tmpTrace 
 SET To = coalesce( 
(select UserName from db2admin.People  where lcase(TO)=ShortName OR lcase(TO)=INetAddr OR lcase(TO)=Fam FETCH FIRST  1  ROWS ONLY),  
TO) 
where.....
может есть способ не преобразовывать 3 раза lcase(TO)? Что-то вроде

Код: plaintext
1.
2.
3.
4.
5.
update  db2admin.tmpTrace 
 SET To = coalesce( 
(select UserName from db2admin.People  where lcase(TO) in(ShortName,INetAddr,Fam) FETCH FIRST  1  ROWS ONLY),  
TO) 
where.....
...
Рейтинг: 0 / 0
Можно ли оптимизировать запросик?
    #32558477
Фотография riman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это из Information Centr'a. Что, проба дала неудовлетворительные результаты?
...
Рейтинг: 0 / 0
Можно ли оптимизировать запросик?
    #32558768
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почему бы не попробовать новенькое - MERGE?
Что-то похожее (синтаксис уточните в книжке) на:


create view xxx as
select t1.primaryKey, max(p1.userName)
from db2admin.tmpTrace t1, db2admin.People p1
where (To<>'' AND to not like '%/%' AND to not in (select UserName from db2admin.People)) and
(lcase(TO)=ShortName or lcase(TO)=INetAddr or lcase(TO)=Fam);

merge into db2admin.tmpTrace t1
using xxx
on xxx.primaryKey=t1.primaryKey
when matched then update set t1.to = xxx.userName
;
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Можно ли оптимизировать запросик?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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