powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Альтернатива FORCE INDEX
2 сообщений из 2, страница 1 из 1
Альтернатива FORCE INDEX
    #33763666
moteus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.

Сталкнулся с такой проблемой.
Есть процедура которая вызываеться в цикле (с клиента) для занесения информации в таблицу. Кол-во вызывов ~10 тыс. Каждый раз процедура должна обнавить/добавить порядка 10 записей.
Заметил что первые 949 вызовов проходят быстро, а дальше идут дикие тормоза (каждый вызов длиться ~1 сек). Изменение количества вызывов в транзакции на результат не повлиял. Далее было замечено что процедура начинает тормозить с определенными данными (т.е. если начинать выполнять процедуру например с 1000 записи из файла то вызов выполняеться за 1 сек. уже в 1 итерации)

Выяснелось что запрос из процедуры
Код: plaintext
1.
2.
update Gateway 
 set Priority =  200  
 where PrefixID =  728  and RouteID =  47 ;
Выполняеться за 0,125 сек., а

Код: plaintext
1.
2.
update Gateway 
 set Priority =  200  
 where PrefixID =  40575  and RouteID =  42 ;
Выполняеться за 0,015 сек.,

В то время как select по обоим условиям выполняеться за 0,015 сек.

PrefixID, RouteID - Внешние ключи
Priority - поле типа integer
Тригеры и доп. индексы отсутствуют.
Кол-во записей ~400 тыс.

Пока писал нашёл причину. При первом UPDATE выбирался не правельный индекс (по RouteID - для одного RouteID сущестует в среднем 50 тыс. записей, в то время как для PrefixID - не более 15).
Поставил директиву FORCE INDEX и все отработало минуты за 2-3.
Хотелось бы узнать можно ли обойтись без FORCE INDEX?
...
Рейтинг: 0 / 0
Альтернатива FORCE INDEX
    #33774984
moteusЗдравствуйте.

Сталкнулся с такой проблемой.
Есть процедура которая вызываеться в цикле (с клиента) для занесения информации в таблицу. Кол-во вызывов ~10 тыс. Каждый раз процедура должна обнавить/добавить порядка 10 записей.
Заметил что первые 949 вызовов проходят быстро, а дальше идут дикие тормоза (каждый вызов длиться ~1 сек). Изменение количества вызывов в транзакции на результат не повлиял. Далее было замечено что процедура начинает тормозить с определенными данными (т.е. если начинать выполнять процедуру например с 1000 записи из файла то вызов выполняеться за 1 сек. уже в 1 итерации)

Выяснелось что запрос из процедуры
Код: plaintext
1.
2.
update Gateway 
 set Priority =  200  
 where PrefixID =  728  and RouteID =  47 ;
Выполняеться за 0,125 сек., а

Код: plaintext
1.
2.
update Gateway 
 set Priority =  200  
 where PrefixID =  40575  and RouteID =  42 ;
Выполняеться за 0,015 сек.,

В то время как select по обоим условиям выполняеться за 0,015 сек.

PrefixID, RouteID - Внешние ключи
Priority - поле типа integer
Тригеры и доп. индексы отсутствуют.
Кол-во записей ~400 тыс.

Пока писал нашёл причину. При первом UPDATE выбирался не правельный индекс (по RouteID - для одного RouteID сущестует в среднем 50 тыс. записей, в то время как для PrefixID - не более 15).
Поставил директиву FORCE INDEX и все отработало минуты за 2-3.
Хотелось бы узнать можно ли обойтись без FORCE INDEX?

update statistics
index rebuid
+
update usage (не обязательно)
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Альтернатива FORCE INDEX
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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