powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Написал вот такую UDF...
9 сообщений из 9, страница 1 из 1
Написал вот такую UDF...
    #32051361
Andrey Taranov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот такую:
Код: plaintext
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.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
CREATE FUNCTION rrr() 
RETURNS @Ost22 table (Period DateTime,Skl Char( 9 ),Tov Char( 9 ),Kontr Char( 13 ),T int,Kvo dec( 18 , 3 ),Sum dec( 18 , 3 ))
Begin 
declare @FirstDayMonth datetime
declare @FirstDayPrevMonth datetime
declare @CurrentDate datetime
declare @LastDate datetime
declare @DaysCount int
declare @Year char( 4 )
declare @Month char( 2 )
declare @Day1 char( 2 )
declare @Day2 char( 2 )
 ---============================================ ???????????? ????????? ========================================
 
set @DaysCount=(select count(distinct left(date_time_iddoc, 8 )) from _1sjourn(nolock) where rf22= 1 )
set @LastDate=(select top  1  convert(datetime,left(date_time_iddoc, 8 )) from _1sjourn(nolock) where rf22= 1  order by date_time_iddoc desc)
 ---============================================ ???? ?? ?????????? ========================================
 
while @DaysCount>- 1  
Begin
  set @CurrentDate=dateadd(day,-@DaysCount,@LastDate)
  set @Year=convert(char( 4 ),datepart(year,@CurrentDate))
  set @Month=datepart(month,@CurrentDate)
  set @Day1='01'
  set @Day2=datepart(day,@CurrentDate)
  if @Month< 10  
   begin
    set @Month='0'+convert(char( 2 ),@Month)
   end
  else
   begin
    set @Month=convert(char( 2 ),@Month)
   end
  if @Day2< 10  
   begin
    set @Day2='0'+convert(char( 2 ),@Day2)
   end
  else
   begin
    set @Day2=convert(char( 2 ),@Day2)
  end
  set @FirstDayMonth=convert(datetime,@Year+@Month+@Day1)
  set @FirstDayPrevMonth=dateadd(month,- 1 ,@FirstDayMonth)

 Insert into @Ost22  
 select Period=@CurrentDate,Skl,Tov,Kontr,t,Kvo=sum(Kvo),Sum=sum(sum) from(
   select Skl=sp26,Tov=sp23,Kontr=sp29,t=sp459,Kvo=sum(sp38),Sum=sum(sp214)
    from RA22(nolock) 
    where date_time_iddoc between @Year+@Month+@Day1 and @Year+@Month+@Day2
    group by sp26,sp23,sp29,sp459
   union all
    select Skl=sp26,Tov=sp23,Kontr=sp29,t=sp459,Kvo=sum(sp38),Sum=sum(sp214)
    from RG22(nolock) 
    where period=@FirstDayPrevMonth
    group by sp26,sp23,sp29,sp459) h 
  group by Skl,Tov,Kontr,t
  set @DaysCount=@DaysCount- 1 
 End
 return 
End

но очень медленно работает - подскажите как улучшить\ускорить, плз
...
Рейтинг: 0 / 0
Написал вот такую UDF...
    #32051366
vadim_march
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Эта матрешка:
Код: plaintext
1.
2.
3.
4.
5.
6.
(  group by
   ...
   union
   ...
   group by )
...
group by
всегда долго работает. Попробуй изменить логику запроса
...
Рейтинг: 0 / 0
Написал вот такую UDF...
    #32051370
Andrey Taranov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А как ? Я ведь подумал - чего то мозги не выворачиваются как улучшить..
Подскажите если кому не тяжело.
...
Рейтинг: 0 / 0
Написал вот такую UDF...
    #32051382
Фотография ziktuw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Распотроши внутренний подзапрос с UNION на вставки (без UNION) в таблицы-переменные. Очень подозрительно выглядит.

Далее. У тебя идет перебор в цикле по дням. Лучше сперва сделать таблицу дней и сджойнить её с остальным. Тогда удасться обойтись без цикла, что существенно ускорит.
...
Рейтинг: 0 / 0
Написал вот такую UDF...
    #32051400
vadim_march
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У Вас, сударь, все три group by делают одно и то же. Попробуйте убрать внутренние group by вовсе
...
Рейтинг: 0 / 0
Написал вот такую UDF...
    #32051403
Andrey Taranov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Внутренние уже убрал - устроилось в два раза быстрее (11 вместо 20 мин.), но объемы только начинаются -чтото через пару лет буит...
сейчас пытаюсь сджоинить
...
Рейтинг: 0 / 0
Написал вот такую UDF...
    #32051411
Andrey Taranov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Чтож происходитто? Работать с временными таблицами в функции нельзя... Инсерт и Апдейт тоже нельзя....
Что за жисть такая... Что кто подскажет? Идея одна - разбивать на несколько запросов... Таблицу дат формировать заранее и т.п. некузявости.
...
Рейтинг: 0 / 0
Написал вот такую UDF...
    #32051413
Фотография VVG_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно спокойно объявлять и работать с переменными типа table.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
create function rrrrrrrr() 
returns @Ost22 table (a int)
Begin 
 declare @t table (a int)
 insert into @t select  1 
 Insert into @Ost22 select * from @t
 return 
End
...
Рейтинг: 0 / 0
Написал вот такую UDF...
    #32051417
vadim_march
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так не лучше?
Код: plaintext
1.
set @FirstDayMonth =
    cast(left(convert(varchar, @CurrentDate, 112 ), 6 )+'01' as datetime)
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Написал вот такую UDF...
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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