|
Головоломка для девелоперов-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, 02:57 |
|
Головоломка для девелоперов-3
|
|||
---|---|---|---|
#18+
execute immediate ... |
|||
:
Нравится:
Не нравится:
|
|||
02.11.2013, 09:23 |
|
Головоломка для девелоперов-3
|
|||
---|---|---|---|
#18+
Еще вариант, если EXECUTE IMMEDIATE недоступен из-за версии сервера, UPDATE STATISTICS LOW t_user_god; перед вызовом процедуры или прямо перед SELECT в процедуре (уже не помню, сработает ли второй вариант). ... |
|||
:
Нравится:
Не нравится:
|
|||
05.11.2013, 03:02 |
|
Головоломка для девелоперов-3
|
|||
---|---|---|---|
#18+
АнатоЛойЕще вариант, если EXECUTE IMMEDIATE недоступен из-за версии сервера, UPDATE STATISTICS LOW t_user_god; перед вызовом процедуры или прямо перед SELECT в процедуре (уже не помню, сработает ли второй вариант). Не сработает. Во-первых, t_user_god временная таблица и создается внутри. Во-вторых, изменение статистики таблиц, участвующих в процедуре, не ведет к обновлению плана процедуры. А главное - правильный план зависит от поступившего в процедуру параметра. Так что да, через динамический SQL, никак иначе. ... |
|||
:
Нравится:
Не нравится:
|
|||
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+
Забыл добавить: и параметр тоже в вызывающей процедуре во временную таблицу положи :). Ну стреляться же товарищам на 7 и 9 информиксе :). ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2013, 02:48 |
|
|
start [/forum/topic.php?fid=44&gotonew=1&tid=1607007]: |
0ms |
get settings: |
19ms |
get forum list: |
5ms |
check forum access: |
1ms |
check topic access: |
1ms |
track hit: |
55ms |
get topic data: |
4ms |
get first new msg: |
3ms |
get forum data: |
0ms |
get page messages: |
158ms |
get tp. blocked users: |
1ms |
others: | 273ms |
total: | 520ms |
0 / 0 |