powered by simpleCommunicator - 2.0.46     © 2025 Programmizd 02
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / ASE 12.5.1 процедура "подвисает" в разных местах
9 сообщений из 9, страница 1 из 1
ASE 12.5.1 процедура "подвисает" в разных местах
    #39695724
SergeFr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пытаемся ускорить работу большой и медленной процедуры, для отладки в разных местах понаставили в нее метки вида

Код: sql
1.
2.
3.
4.
5.
IF 'sa' = suser_name()
BEGIN 
    INSERT INTO w_getdate5 
    SELECT 2, GetDate (), DATEDIFF(ms,Max (date_time),GetDate ()) FROM w_getdate5 
END



и получилось что процедура стабильно в разных местах непонятно почему зависает на несколько (5-10) секунд.

Например вот такой код:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
IF 'sa' = suser_name()
BEGIN 
    INSERT INTO w_getdate5 
    SELECT 14, GetDate (), DATEDIFF(ms,Max (date_time),GetDate ()) FROM w_getdate5 
END 

    /* Если проставлен идентификатор сделки через пробел */ 
    IF DATALENGTH(RTRIM   (@number)) > 2    AND 
       PATINDEX('%[!-,]%', @number)  = 0    AND 
       PATINDEX('%[.-/]%', @number)  = 0    AND 
       PATINDEX('%[:-@]%', @number)  = 0    AND 
       PATINDEX('%[А-я]%', @number)  = 0 /* исключаем русские буквы*/       AND 
       PATINDEX('%acc',    @number ) = 0 /* Эта проверка делается ниже */   AND 
       PATINDEX('NULLacc', @number ) = 0 /* Эта проверка делается ниже */ 
    BEGIN 

        /* Проверка на наличие окончание 'id' - начало соответствует индентификатору сделки */ 
        WHILE NOT PATINDEX('%id%',@number ) = 0 
        BEGIN 
            SELECT @f_deal = CONVERT(int, SUBSTRING(@number,1, PATINDEX('%id%',@number ) - 1)) 
            
            SELECT @number = SUBSTRING(@number, PATINDEX('%id%',@number ) + 2, DATALENGTH (@number)) 
            
            /* список сделок по номеру с 'id' в конце идентификатора сделки */ 
            INSERT INTO #f_deal_number 
            ( 
                    f_deal 
            ) 
            SELECT  @f_deal 
        END 
    END 

IF 'sa' = suser_name()
BEGIN 
    INSERT INTO w_getdate5 
    SELECT 2, GetDate (), DATEDIFF(ms,Max (date_time),GetDate ()) FROM w_getdate5 
END



отработал 5 секунд, хотя переменная @number = NULL, то есть тут вообще никаких расчетов нет и работать должно мгновенно.

Подскажите пожалуйста, может быть будут какие-то идеи куда тут копать?
...
Рейтинг: 0 / 0
ASE 12.5.1 процедура "подвисает" в разных местах
    #39696716
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SergeFr,

А вот по какаой причине вы пишите вот так вот?

Код: sql
1.
IF 'sa' = suser_name()



А не так?

Код: sql
1.
IF suser_name() == 'sa'



А так -- вам надо просто аккуратно программировать процедуры, корректно проверять все случаи и контролировать что они не зацикливаются.
...
Рейтинг: 0 / 0
ASE 12.5.1 процедура "подвисает" в разных местах
    #39696718
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SergeFr,

автори получилось что процедура стабильно в разных местах непонятно почему зависает на несколько (5-10) секунд.

Если вы сделали такие выводы на основе времён, записанных в лог в поле, в которое вы кладёте GetDate (), то
очень запросто это может быть не так.
Т.е. реально процедура вообще не "подвисает".
...
Рейтинг: 0 / 0
ASE 12.5.1 процедура "подвисает" в разных местах
    #39696997
SergeFr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZivSergeFr,

А вот по какаой причине вы пишите вот так вот?

Код: sql
1.
IF 'sa' = suser_name()



А не так?

Код: sql
1.
IF suser_name() == 'sa'



А так -- вам надо просто аккуратно программировать процедуры, корректно проверять все случаи и контролировать что они не зацикливаются.

От перестановки операндов результат не поменяется. А если бы зацикливалось, то на одинаковых данных процедура подвисала бы в одном и том же месте, это я бы уже нашел. Да и нет в этой процедуре каких-то сложных циклов.
...
Рейтинг: 0 / 0
ASE 12.5.1 процедура "подвисает" в разных местах
    #39696999
SergeFr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZivSergeFr,

автори получилось что процедура стабильно в разных местах непонятно почему зависает на несколько (5-10) секунд.

Если вы сделали такие выводы на основе времён, записанных в лог в поле, в которое вы кладёте GetDate (), то
очень запросто это может быть не так.
Т.е. реально процедура вообще не "подвисает".

А почему так? Я уже довольно давно таким методом пользуюсь для оптимизации и раньше он всегда давал верную картину. Что с ним не так? И какой метод тогда вы считаете более правильно использовать?
...
Рейтинг: 0 / 0
ASE 12.5.1 процедура "подвисает" в разных местах
    #39699278
Mikle83
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SergeFr,
У вас случаем блокировки|задержки не возникают при записи в вашу таблицу логов?

Есть возможность дёрнуть процедуру автономно, или нужен контекст для вызова.?

Попробуйте записать разницу во времени между входом и выходом из блока в консоль.

Залогируйте значения переменных рядом со временем. Может будет корреляции видна.
...
Рейтинг: 0 / 0
ASE 12.5.1 процедура "подвисает" в разных местах
    #39700786
SergeFr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mikle83SergeFr,
У вас случаем блокировки|задержки не возникают при записи в вашу таблицу логов?

Есть возможность дёрнуть процедуру автономно, или нужен контекст для вызова.?

Попробуйте записать разницу во времени между входом и выходом из блока в консоль.

Залогируйте значения переменных рядом со временем. Может будет корреляции видна.

Спасибо за идею! Попробовал таким образом отследить время вставки:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
IF 'sa' = suser_name() 
BEGIN 
    SELECT @dt_copy = @dt_before 
    SELECT @dt_before = getdate() 
    INSERT INTO w_getdate51 
    SELECT 248, GetDate (), DATEDIFF(ms,Max (date_time),GetDate ()), @dt_copy, @dt_after FROM w_getdate51 
    SELECT @dt_after = getdate() 
END



То есть я тут запоминаю время вставки по предыдущей метке и сохраняю при следующей вставке.
Погонял на разных объемах, разница стабильно не более нескольких миллисекунд, так что похоже что не в этом проблема.
...
Рейтинг: 0 / 0
ASE 12.5.1 процедура "подвисает" в разных местах
    #39700870
SergeFr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SergeFrMikle83SergeFr,
У вас случаем блокировки|задержки не возникают при записи в вашу таблицу логов?

Есть возможность дёрнуть процедуру автономно, или нужен контекст для вызова.?

Попробуйте записать разницу во времени между входом и выходом из блока в консоль.

Залогируйте значения переменных рядом со временем. Может будет корреляции видна.

Спасибо за идею! Попробовал таким образом отследить время вставки:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
IF 'sa' = suser_name() 
BEGIN 
    SELECT @dt_copy = @dt_before 
    SELECT @dt_before = getdate() 
    INSERT INTO w_getdate51 
    SELECT 248, GetDate (), DATEDIFF(ms,Max (date_time),GetDate ()), @dt_copy, @dt_after FROM w_getdate51 
    SELECT @dt_after = getdate() 
END



То есть я тут запоминаю время вставки по предыдущей метке и сохраняю при следующей вставке.
Погонял на разных объемах, разница стабильно не более нескольких миллисекунд, так что похоже что не в этом проблема.

UPD: После дополнительных тестов выяснилось, что иногда все-таки действительно на вставке в таблицу с логом умирает на несколько секунд, будем это учитывать при отладке, спасибо.
...
Рейтинг: 0 / 0
ASE 12.5.1 процедура "подвисает" в разных местах
    #39706135
Mikle83
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SergeFr,

Залогируйте значения переменных рядом со временем. Может будет корреляции видна.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / ASE 12.5.1 процедура "подвисает" в разных местах
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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