Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
02.11.2013, 02:57
|
|||
---|---|---|---|
Головоломка для девелоперов-3 |
|||
#18+
Столкнулся давеча с проблемой. Есть хранимая процедура. В процедуре есть SQL запрос, который фильтрует список владельцев по фамилии, передаваемой как параметр. Нас интересуют только первые 1024 записи. Кроме того, показывать надо только тех владельцев, доступ к компаниям которых разрешен запрашивающему (лежит в таблице t_user_god). То есть имеется второй фильтр, по списку компаний. Возникает ситуация: если фамилия редкая, то лучше выполнение начинать с фамилии - поле проиндексировано. owner_person->owner -> account , фильтр по компании Код: sql 1. 2. 3. 4. 5. 6. 7.
Если фамилия популярная, то лучше начинать таблицы account, где тоже есть индекс на company_number: account-> owner->owner_person. В dbaccess все работает прекрасно, оптимайзер выбирает самый быстрый вариант. В хранимке - хорошо работает либо в одном, либо во втором варианте. Что делать ? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
02.11.2013, 09:23
|
|||
---|---|---|---|
|
|||
Головоломка для девелоперов-3 |
|||
#18+
execute immediate ... |
|||
:
Нравится:
Не нравится:
|
|||
|
05.11.2013, 03:02
|
|||
---|---|---|---|
Головоломка для девелоперов-3 |
|||
#18+
Еще вариант, если EXECUTE IMMEDIATE недоступен из-за версии сервера, UPDATE STATISTICS LOW t_user_god; перед вызовом процедуры или прямо перед SELECT в процедуре (уже не помню, сработает ли второй вариант). ... |
|||
:
Нравится:
Не нравится:
|
|||
|
05.11.2013, 21:26
|
|||
---|---|---|---|
Головоломка для девелоперов-3 |
|||
#18+
АнатоЛойЕще вариант, если EXECUTE IMMEDIATE недоступен из-за версии сервера, UPDATE STATISTICS LOW t_user_god; перед вызовом процедуры или прямо перед SELECT в процедуре (уже не помню, сработает ли второй вариант). Не сработает. Во-первых, t_user_god временная таблица и создается внутри. Во-вторых, изменение статистики таблиц, участвующих в процедуре, не ведет к обновлению плана процедуры. А главное - правильный план зависит от поступившего в процедуру параметра. Так что да, через динамический SQL, никак иначе. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
06.11.2013, 02:44
|
|||
---|---|---|---|
Головоломка для девелоперов-3 |
|||
#18+
ВыбегаллоАнатоЛойЕще вариант, если EXECUTE IMMEDIATE недоступен из-за версии сервера, UPDATE STATISTICS LOW t_user_god; перед вызовом процедуры или прямо перед SELECT в процедуре (уже не помню, сработает ли второй вариант). Не сработает. Во-первых, t_user_god временная таблица и создается внутри. Во-вторых, изменение статистики таблиц, участвующих в процедуре, не ведет к обновлению плана процедуры. А главное - правильный план зависит от поступившего в процедуру параметра. Так что да, через динамический SQL, никак иначе. Где создается временная таблица, мы не знали. Вынести выполнение запроса из задачи в отдельную процедуру - и вуаля! :) ... |
|||
:
Нравится:
Не нравится:
|
|||
|
06.11.2013, 02:48
|
|||
---|---|---|---|
Головоломка для девелоперов-3 |
|||
#18+
Забыл добавить: и параметр тоже в вызывающей процедуре во временную таблицу положи :). Ну стреляться же товарищам на 7 и 9 информиксе :). ... |
|||
:
Нравится:
Не нравится:
|
|||
|
|
start [/forum/topic.php?fid=44&tablet=1&tid=1607007]: |
0ms |
get settings: |
16ms |
get forum list: |
5ms |
check forum access: |
1ms |
check topic access: |
1ms |
track hit: |
39ms |
get topic data: |
2ms |
get forum data: |
1ms |
get page messages: |
155ms |
get tp. blocked users: |
0ms |
others: | 295ms |
total: | 515ms |
0 / 0 |