Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Написал вот такую UDF... / 9 сообщений из 9, страница 1 из 1
18.09.2002, 16:05:43
    #32051361
Andrey Taranov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Написал вот такую UDF...
Вот такую:
Код: 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
18.09.2002, 16:15:08
    #32051366
vadim_march
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Написал вот такую UDF...
Эта матрешка:
Код: plaintext
1.
2.
3.
4.
5.
6.
(  group by
   ...
   union
   ...
   group by )
...
group by
всегда долго работает. Попробуй изменить логику запроса
...
Рейтинг: 0 / 0
18.09.2002, 16:22:24
    #32051370
Andrey Taranov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Написал вот такую UDF...
А как ? Я ведь подумал - чего то мозги не выворачиваются как улучшить..
Подскажите если кому не тяжело.
...
Рейтинг: 0 / 0
18.09.2002, 16:39:46
    #32051382
ziktuw
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Написал вот такую UDF...
Распотроши внутренний подзапрос с UNION на вставки (без UNION) в таблицы-переменные. Очень подозрительно выглядит.

Далее. У тебя идет перебор в цикле по дням. Лучше сперва сделать таблицу дней и сджойнить её с остальным. Тогда удасться обойтись без цикла, что существенно ускорит.
...
Рейтинг: 0 / 0
18.09.2002, 17:04:01
    #32051400
vadim_march
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Написал вот такую UDF...
У Вас, сударь, все три group by делают одно и то же. Попробуйте убрать внутренние group by вовсе
...
Рейтинг: 0 / 0
18.09.2002, 17:10:44
    #32051403
Andrey Taranov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Написал вот такую UDF...
Внутренние уже убрал - устроилось в два раза быстрее (11 вместо 20 мин.), но объемы только начинаются -чтото через пару лет буит...
сейчас пытаюсь сджоинить
...
Рейтинг: 0 / 0
18.09.2002, 17:37:13
    #32051411
Andrey Taranov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Написал вот такую UDF...
Чтож происходитто? Работать с временными таблицами в функции нельзя... Инсерт и Апдейт тоже нельзя....
Что за жисть такая... Что кто подскажет? Идея одна - разбивать на несколько запросов... Таблицу дат формировать заранее и т.п. некузявости.
...
Рейтинг: 0 / 0
18.09.2002, 17:45:17
    #32051413
VVG_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Написал вот такую UDF...
Можно спокойно объявлять и работать с переменными типа 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
18.09.2002, 17:53:31
    #32051417
vadim_march
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Написал вот такую UDF...
так не лучше?
Код: plaintext
1.
set @FirstDayMonth =
    cast(left(convert(varchar, @CurrentDate, 112 ), 6 )+'01' as datetime)
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Написал вот такую UDF... / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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