Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Долго вызывается функция  [new]
relav
Member

Откуда:
Сообщений: 204
Есть функция на сервере P_CREATE_PHONE_SUBRANGE. Вызываю ее я из клиента БД MS manager 2008. Вызывается она порядка 2-х минут. Функция выполняет только вывод на экран с помощью функции raiserror(). Какие есть предположения почему так долго?
12 июн 15, 14:49    [17763976]     Ответить | Цитировать Сообщить модератору
 Re: Долго вызывается функция  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
В функции нельзя выполнять команду raiserror.
12 июн 15, 14:51    [17763982]     Ответить | Цитировать Сообщить модератору
 Re: Долго вызывается функция  [new]
relav
Member

Откуда:
Сообщений: 204
Гавриленко Сергей Алексеевич,

в других функциях у меня выполняется команда raiserror(). Но, даже если убрать эту команду все равно функция долго вызывается порядка 2-х минут.

вот сама функция:
+
CREATE PROCEDURE [oss].[P_CREATE_PHONE_SUBRANGE_1](@code varchar(50),
												 @phone_begin varchar(50),
                                                 @phone_end varchar(50),
                                                 @chassis_phone int,
                                                 @state_technical int,
                                                 @COMMENT varchar(1000),
                                                 @range int                                                 
                                                )                                                  
AS
BEGIN

 raiserror('В p_create_phone_subrange',16,1);


declare @phone_range_begin int, @phone_range_end int,@organization int;
declare @vid int,@user int,@phone int, @st_id int,@len int,@p int;
declare @tbl table(phone int);
declare @city int;

select @user=ID from meta_clients where CODE=meta.f_user();

set @len = len(@phone_begin);
set @p =1;
while (@p <= @len)
	begin
       if (substring(@phone_begin,@p,1) not in ('0','1','2','3','4','5','6','7','8','9'))
       		raiserror('Номер ОТ содержит недопустимые символы',16,1);
       set @p = @p +1;
    end;

set @len = len(@phone_end);
set @p =1;
while (@p <= @len)
	begin
       if (substring(@phone_end,@p,1) not in ('0','1','2','3','4','5','6','7','8','9'))
       		raiserror('Номер ДО содержит недопустимые символы',16,1);
       set @p = @p +1;
    end;

select @phone_range_begin = p.phone_begin, 
        @phone_range_end = p.phone_end,
        @organization = c.organization_id,
        @city = p.CITY
 from phone_range p
 left join v_city c on p.city=c.ID  
 where p.ID = @range; 
 
   if(@phone_begin >= @phone_range_begin and @phone_begin < @phone_range_end and
      @phone_end >= @phone_begin and @phone_end <= @phone_range_end)
      begin
        
        insert into @tbl select p.phone from phone p
        				 left join abs_types a on p.state = a.id 
                         where  p.phone between @phone_begin and @phone_end AND
                                a.code = 'занят'
        
        insert into phone_range     
			(city,phone_begin,phone_end,pid,chassis_phone,state_technical,comment)    
        select distinct
             @city,cast(@phone_begin as int),cast(@phone_end as int),@range,@chassis_phone,@state_technical,@comment
     
    	set @vid = IDENT_CURRENT('oss.phone_range');
        set @phone = @phone_begin;
        
        select @st_id = a.id from abs_types a
        where a.META_CATEGORY = 'phone_state' and a.code = 'свободен'
        
        while(@phone <= @phone_end)
     	   BEGIN
           	if(@phone in (select * from @tbl))
            	RAISERROR('Номер %d уже занят. Введите правильный поддиапазон',16,1,@phone);
           		
              update phone 
              set phone_subrange = @vid,
                  state = @st_id,
                  state_technical = @state_technical,
                  chassis_phone = @chassis_phone,
                  comments = @comment,
                  modify_user = @user,
                  modify_date = Getdate()    
              where phone = @phone and phone_range = @range;
      		  
              set @phone = @phone +1;
           END
      end  
   else raiserror('Поддиапазон не входит в диапазон',16,1);         
END
12 июн 15, 14:54    [17763991]     Ответить | Цитировать Сообщить модератору
 Re: Долго вызывается функция  [new]
Glory
Member

Откуда:
Сообщений: 104751
relav
вот сама функция:

Только это процедура

relav
Но, даже если убрать эту команду все равно функция долго вызывается порядка 2-х минут.

Вы хотите, чтобы кто-то угадал, сколько времени из этих 2х минут берет каждая из команд ?
12 июн 15, 15:04    [17764029]     Ответить | Цитировать Сообщить модератору
 Re: Долго вызывается функция  [new]
relav
Member

Откуда:
Сообщений: 204
проблема в том , если я оставляю в процедуре только raiserror() , а все остальное комментирую, то функция из клиента вызывается быстро, а вот если комментарии убрать , то процедура начинается вызываться долго. В чем может быть причина?
12 июн 15, 15:17    [17764077]     Ответить | Цитировать Сообщить модератору
 Re: Долго вызывается функция  [new]
Glory
Member

Откуда:
Сообщений: 104751
relav
В чем может быть причина?

В том, что несколько сложных команд выполняются больше, чем одна простая
12 июн 15, 16:08    [17764280]     Ответить | Цитировать Сообщить модератору
 Re: Долго вызывается функция  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31948
relav
проблема в том , если я оставляю в процедуре только raiserror() , а все остальное комментирую, то функция из клиента вызывается быстро, а вот если комментарии убрать , то процедура начинается вызываться долго. В чем может быть причина?
Процедура - аццкий ад. Циклами проверять наличие недопустимого символа в строке - это нечто. Циклами апдэйтить из одной таблицы другую, эмулируя JOIN - второй ужас.
12 июн 15, 21:27    [17765397]     Ответить | Цитировать Сообщить модератору
 Re: Долго вызывается функция  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
relav
проблема в том , если я оставляю в процедуре только raiserror() , а все остальное комментирую, то функция из клиента вызывается быстро, а вот если комментарии убрать , то процедура начинается вызываться долго. В чем может быть причина?
Ну так и оставьте только raiserror, если как вы говорите процедура больше ничего полезного не делает. Остальные непонятные команды наверное написал какой то диверсант-саботажник, чтобы вас уволили с работы за то что процедура медленно выводит raiserror.
12 июн 15, 22:08    [17765534]     Ответить | Цитировать Сообщить модератору
 Re: Долго вызывается функция  [new]
relav
Member

Откуда:
Сообщений: 204
alexeyvg,

а как можно проверить вхождение недопустимого символа в строке?
23 июн 15, 22:28    [17808877]     Ответить | Цитировать Сообщить модератору
 Re: Долго вызывается функция  [new]
Oleksii Kovalov
Member

Откуда:
Сообщений: 100
relav
alexeyvg,

а как можно проверить вхождение недопустимого символа в строке?

like '%[^0-9]%'
23 июн 15, 22:45    [17808914]     Ответить | Цитировать Сообщить модератору
 Re: Долго вызывается функция  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8805
Oleksii Kovalov,

вообще неверный подход. Надо не гадать хороший-плохой, а написать генератор номеров. Получать гарантированно хороший.
24 июн 15, 12:52    [17810821]     Ответить | Цитировать Сообщить модератору
 Re: Долго вызывается функция  [new]
Oleksii Kovalov
Member

Откуда:
Сообщений: 100
Владислав Колосов
Oleksii Kovalov,

вообще неверный подход. Надо не гадать хороший-плохой, а написать генератор номеров. Получать гарантированно хороший.

Можно и написать, отчего бы и нет?
но это всё равно не избавит нас от необходимости проверять входные параметры.
24 июн 15, 13:22    [17811021]     Ответить | Цитировать Сообщить модератору
 Re: Долго вызывается функция  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8805
Oleksii Kovalov,

Зачем проверять, вы будете передавать не диапазоны номеров, а номер узла или АТС. Если АТС не будет найдена - получите ошибку отсутствия. Для АТС распишите диапазоны и т.д.
24 июн 15, 13:28    [17811070]     Ответить | Цитировать Сообщить модератору
 Re: Долго вызывается функция  [new]
Oleksii Kovalov
Member

Откуда:
Сообщений: 100
Владислав Колосов
Oleksii Kovalov,

Зачем проверять, вы будете передавать не диапазоны номеров, а номер узла или АТС. Если АТС не будет найдена - получите ошибку отсутствия. Для АТС распишите диапазоны и т.д.


Давайте отделять: котлет отдельно, мух - отдельно
Т.е. решение частной практической задачи отделим от изменения дизайна приложения.
Я вот, к примеру, понятия не имею, откуда берётся входная информация для данной процедуры. М.б. из какого-то внешнего источника, влиять на который я не могу.
с другой стороны, при задании диапазонов для АТС - всё равно нужно будет проверять валидность
с третьей - показать человеку, что не нужно проверять посимвольно, можно как-то иначе.
24 июн 15, 14:45    [17811555]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить