Гость
Map
Форумы / Informix [игнор отключен] [закрыт для гостей] / Головоломка для девелоперов-3 / 7 сообщений из 7, страница 1 из 1
02.11.2013, 02:57
    #38450716
Выбегалло
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Головоломка для девелоперов-3
Столкнулся давеча с проблемой.

Есть хранимая процедура. В процедуре есть SQL запрос, который фильтрует список владельцев по фамилии, передаваемой как параметр. Нас интересуют только первые 1024 записи.
Кроме того, показывать надо только тех владельцев, доступ к компаниям которых разрешен запрашивающему (лежит в таблице t_user_god). То есть имеется второй фильтр, по списку компаний.

Возникает ситуация: если фамилия редкая, то лучше выполнение начинать с фамилии - поле проиндексировано.
owner_person->owner -> account , фильтр по компании

Код: sql
1.
2.
3.
4.
5.
6.
7.
 SELECT  {+ ORDERED INDEX ( owner_person idx_own_pers_ul) AVOID_HASH(account)}
      FIRST 1025 op.owner_number
        FROM owner_person op, owner o, account a
        WHERE op.upper_lname like p_upper_name
        AND op.owner_number = o.owner_number
        AND o.account_number = a.account_number
        AND a.company_number IN (SELECT company_number FROM  t_user_god WHERE company_number IS NOT NULL);



Если фамилия популярная, то лучше начинать таблицы account, где тоже есть индекс на company_number:

account-> owner->owner_person.

В dbaccess все работает прекрасно, оптимайзер выбирает самый быстрый вариант.

В хранимке - хорошо работает либо в одном, либо во втором варианте.

Что делать ?
...
Рейтинг: 0 / 0
02.11.2013, 09:23
    #38450741
zzz123
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Головоломка для девелоперов-3
execute immediate
...
Рейтинг: 0 / 0
05.11.2013, 03:02
    #38452468
АнатоЛой
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Головоломка для девелоперов-3
Еще вариант, если EXECUTE IMMEDIATE недоступен из-за версии сервера,
UPDATE STATISTICS LOW t_user_god;
перед вызовом процедуры или прямо перед SELECT в процедуре (уже не помню, сработает ли второй вариант).
...
Рейтинг: 0 / 0
05.11.2013, 21:26
    #38453720
Выбегалло
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Головоломка для девелоперов-3
АнатоЛойЕще вариант, если EXECUTE IMMEDIATE недоступен из-за версии сервера,
UPDATE STATISTICS LOW t_user_god;
перед вызовом процедуры или прямо перед SELECT в процедуре (уже не помню, сработает ли второй вариант).

Не сработает. Во-первых, t_user_god временная таблица и создается внутри. Во-вторых, изменение статистики таблиц, участвующих в процедуре, не ведет к обновлению плана процедуры. А главное - правильный план зависит от поступившего в процедуру параметра.

Так что да, через динамический SQL, никак иначе.
...
Рейтинг: 0 / 0
06.11.2013, 02:44
    #38453888
АнатоЛой
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Головоломка для девелоперов-3
ВыбегаллоАнатоЛойЕще вариант, если EXECUTE IMMEDIATE недоступен из-за версии сервера,
UPDATE STATISTICS LOW t_user_god;
перед вызовом процедуры или прямо перед SELECT в процедуре (уже не помню, сработает ли второй вариант).

Не сработает. Во-первых, t_user_god временная таблица и создается внутри. Во-вторых, изменение статистики таблиц, участвующих в процедуре, не ведет к обновлению плана процедуры. А главное - правильный план зависит от поступившего в процедуру параметра.

Так что да, через динамический SQL, никак иначе.
Где создается временная таблица, мы не знали.
Вынести выполнение запроса из задачи в отдельную процедуру - и вуаля! :)
...
Рейтинг: 0 / 0
06.11.2013, 02:48
    #38453889
АнатоЛой
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Головоломка для девелоперов-3
Забыл добавить: и параметр тоже в вызывающей процедуре во временную таблицу положи :).
Ну стреляться же товарищам на 7 и 9 информиксе :).
...
Рейтинг: 0 / 0
13.11.2013, 23:03
    #38464233
Выбегалло
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Головоломка для девелоперов-3
АнатоЛойЗабыл добавить: и параметр тоже в вызывающей процедуре во временную таблицу положи :).
Ну стреляться же товарищам на 7 и 9 информиксе :).

Не работает, я попробовал. Таки да, стреляться.
...
Рейтинг: 0 / 0
Форумы / Informix [игнор отключен] [закрыт для гостей] / Головоломка для девелоперов-3 / 7 сообщений из 7, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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