powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / 2 Дед Маздай. Приглашение на тест
31 сообщений из 31, показаны все 2 страниц
2 Дед Маздай. Приглашение на тест
    #32038819
Небольшая модификация алгоритма SuperSerg привела к тому что подсчет счастливых билетов на T-SQL стал выполняться вместо 2223 ms стало 80-90 ms (у меня тачка слабая P3 800 128 Мб и куча приложений запущено). Все таки этот тест мало что покажет дело в том, кто как реализует алгоритмы и что позволяет та или иная среда разработки.

Вот немного измененный алгоритм SuperSerg'а.
Код: 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.
create table #t(i int)
insert #t select  1 
insert #t select  2 
insert #t select  3 
insert #t select  4 
insert #t select  5 
insert #t select  6 
insert #t select  7 
insert #t select  8 
insert #t select  9 
insert #t select  0 

declare @d datetime
declare @i int
declare @cnt int
select @d = getdate()
Set @i= 0 
Set @cnt= 0 
while @i< 28 
begin
	select @cnt=@cnt+count(*)*count(*) from #t t4,#t t5,#t t6
	where @i = t4.i + t5.i + t6.i
	Set @i=@i+ 1 
end
select @cnt As kolvo,datediff(ms, @d, getdate())
drop table #t
...
Рейтинг: 0 / 0
2 Дед Маздай. Приглашение на тест
    #32038821
Фотография Maxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не Дед Мазай но все же 110ms
...
Рейтинг: 0 / 0
2 Дед Маздай. Приглашение на тест
    #32038822
Фотография Maxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
93 ms
...
Рейтинг: 0 / 0
2 Дед Маздай. Приглашение на тест
    #32038823
Алекс_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
что за тачка?
у меня 80 стабильно.
Я сейчас долго вспоминал тервер, но что то так и не смог я к этой задаче его привязать поэтому только смог так модифицировать. Но кажется что можно в лоб при помощи тервера посчитать.
...
Рейтинг: 0 / 0
2 Дед Маздай. Приглашение на тест
    #32038825
Rom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
от 60 до 80
...
Рейтинг: 0 / 0
2 Дед Маздай. Приглашение на тест
    #32038828
Hibernate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
63 (PIII-1Гц)
...
Рейтинг: 0 / 0
2 Дед Маздай. Приглашение на тест
    #32038832
Зайцев Фёдор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
80-90
P3 933
...
Рейтинг: 0 / 0
2 Дед Маздай. Приглашение на тест
    #32038833
tyblin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
40
...
Рейтинг: 0 / 0
2 Дед Маздай. Приглашение на тест
    #32038847
2 tyblin
У тебя наверно тачка помощней моей будет. Но все же я еще оптимизировал и теперь результат c вероятностью 1/2 - 40ms, 50ms опять же на P3-800.
...
Рейтинг: 0 / 0
2 Дед Маздай. Приглашение на тест
    #32038851
tyblin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MSDE на PIV Northwood 2 Gh 256 Mb
...
Рейтинг: 0 / 0
2 Дед Маздай. Приглашение на тест
    #32038858
Ал
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну конечно спору нет 2Ghz против моих 800 Mhz.
Но все же результата я добился такого же 40 ms как и на 2 Ghz немного подумав над задачей.
...
Рейтинг: 0 / 0
2 Дед Маздай. Приглашение на тест
    #32038866
Rom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
от 60 до 80
...
Рейтинг: 0 / 0
2 Дед Маздай. Приглашение на тест
    #32038873
Вот более оптимизированный алгоритм подсчета (можно конечно было расширенную сделать, но влом понятное дело быстрее будет хочется на T-SQL добиться лучших результатов)

Код: 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.
create table #t(i int)
insert #t select  1 
insert #t select  2 
insert #t select  3 
insert #t select  4 
insert #t select  5 
insert #t select  6 
insert #t select  7 
insert #t select  8 
insert #t select  9 
insert #t select  0 

declare @d datetime
declare @i int
declare @cnt int
select @d = getdate()
Set @i= 0 
Set @cnt= 0 
while @i< 14 
begin
	select @cnt=@cnt+count(*)*count(*) from #t t4,#t t5,#t t6
	where @i = t4.i + t5.i + t6.i
	Set @i=@i+ 1 
end
select  2 *@cnt As kolvo,datediff(ms, @d, getdate())
drop table #t


Этот алгоритм мало чем отличается от предыдущего единственная разница в том, что цикл выполняется до 14 потому что задача имеет симметрию, т.е. для @i=k где k=0-13 и для @i=27-k count(*) равны. Поэтому мы пробегаем половину цикла, а результат умножаем на 2.

Да, зато как разочаровался я в MSSQL по поводу отсутствия на T-SQL массивов, если раньше я считал на хрена массивы когда есть таблицы и чем они хуже массивов. На первый взгляд они лучше, но время работы очень медленное.

Вот думал будет побыстрее

Код: 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.
create table #t(i int,cnt int)

declare @d datetime
declare @i int,@i1 int,@i2 int,@i3 int
declare @cnt int

Set @i= 0 
while @i< 28 
begin
	insert into #t(i,cnt) VALUES ( @i, 0 )
	Set @i=@i+ 1 
end
select @d = getdate()
Set @i1= 0 
Set @cnt= 0 
while @i1< 10 
begin
   Set @i2= 0 
   while @i2< 10 
   Begin
     Set @i3= 0 
     while @i3< 10 
     Begin
	update #t Set cnt=cnt+ 1  where i=@i1+@i2+@i3  --закоментирую 10 ms не закоментирую 450
 
   	Set @i3=@i3+ 1 	
     End
     Set @i2=@i2+ 1 	
   End
   Set @i1=@i1+ 1 
end
select * from #t
select sum(cnt*cnt) As kolvo,datediff(ms, @d, getdate()) from #t
drop table #t


Считать, он считает но за 450 это совсем никуда негодиться.
...
Рейтинг: 0 / 0
2 Дед Маздай. Приглашение на тест
    #32038899
Фотография Maxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все вылезли из сервера результат - 34-36ms
...
Рейтинг: 0 / 0
2 Дед Маздай. Приглашение на тест
    #32038904
SergCat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, зато как разочаровался я в MSSQL по поводу отсутствия на T-SQL массивов, если раньше я считал на хрена массивы когда есть таблицы и чем они хуже массивов. На первый взгляд они лучше, но время работы очень медленное.

По этому поводу в BOL к SQL2000 сказано следующее:
Use table variables instead of temporary tables, whenever possible.
...
Рейтинг: 0 / 0
2 Дед Маздай. Приглашение на тест
    #32038908
Artem
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А где же Дед Маздай ?? :)

AMD 1800+ 512 Mb
от 30-70
XP + куча ерунды
последний раз ставил месяц назад
но с этих пор много ... натекло

И еще чего хотели добиться?
...
Рейтинг: 0 / 0
2 Дед Маздай. Приглашение на тест
    #32038937
Алексей  К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 SergCat
Я как то не подумал что они(table variables) будут быстрее работать.
Проверил ни какой разницы в производительности нет между table variables и временными таблицами. Вернее есть но в худшую сторону
table variables 490-500 ms
#t 440-450 ms
Очень жаль а так хотелось что бы работали как обычные массивы.
...
Рейтинг: 0 / 0
2 Дед Маздай. Приглашение на тест
    #32038948
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Алексей Кубенко
Суть то была чтобы заставить сервер считать, а не наоборот :)
По Вашему методу я еще в 8-м классе подсчитал количество на бумажке в столбик.

Кстати мой самый первый сервер ( P90, MS SQL 4) считал это 38 сек.
...
Рейтинг: 0 / 0
2 Дед Маздай. Приглашение на тест
    #32038950
Sanek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
130 (227 Mhz 280 Ram)
...
Рейтинг: 0 / 0
2 Дед Маздай. Приглашение на тест
    #32038957
Фотография MiCe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
у меня от 30 до 13...
Код: 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.
declare @t table (i int not null )
insert @t select  1 
insert @t select  2 
insert @t select  3 
insert @t select  4 
insert @t select  5 
insert @t select  6 
insert @t select  7 
insert @t select  8 
insert @t select  9 
insert @t select  0 

declare @d datetime
declare @i int
declare @cnt int
select @d = getdate()
Set @i= 0 
Set @cnt= 0 
while @i< 14 
begin
	select @cnt=@cnt+count(*)*count(*) from @t t4,@t t5,@t t6
	where @i = t4.i + t5.i + t6.i
	Set @i=@i+ 1 
end
select  2 *@cnt As kolvo,datediff(ms, @d, getdate())

...
Рейтинг: 0 / 0
2 Дед Маздай. Приглашение на тест
    #32038961
Фотография MiCe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да и притом что с времменной таблицей 30-60.....
и всетаки она в памяти.... если конечно ее хватает.. ;))
всем бай....
...
Рейтинг: 0 / 0
2 Дед Маздай. Приглашение на тест
    #32038977
ComeRun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Server peregruzhen(pashet 2 mesyaca bez reboot), okolo 20 TS client, ezheminutno startujut 15 jobs... Tem ne menee - 16ms.
...
Рейтинг: 0 / 0
2 Дед Маздай. Приглашение на тест
    #32038994
Фотография ziktuw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Этот алгоритм можно изменить, чтобы он считал от 0 до 16ms:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
set nocount on
declare @d datetime
declare @cnt int
select @d = getdate()
select @cnt= 2 *sum(cou) from
(select count(*)*count(*) cou
 from (select t1.i + t2.i + t3.i i 
       from (select  0  i union select  1  union select  2  union select  3  union select  4  union select  5  union select  6  union select  7  union select  8  union select  9 ) t1,
            (select  0  i union select  1  union select  2  union select  3  union select  4  union select  5  union select  6  union select  7  union select  8  union select  9 ) t2,
            (select  0  i union select  1  union select  2  union select  3  union select  4  union select  5  union select  6  union select  7  union select  8  union select  9 ) t3) l1
 where i between  0  and  13 
 group by i) l2
select @cnt As kolvo,datediff(ms, @d, getdate())
...
Рейтинг: 0 / 0
2 Дед Маздай. Приглашение на тест
    #32039019
Фотография MiCe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
по моему всетаки так лучше.... но это мелочи...
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
set nocount on
declare @t table  (i int  not null )
insert @t select  1 
insert @t select  2 
insert @t select  3 
insert @t select  4 
insert @t select  5 
insert @t select  6 
insert @t select  7 
insert @t select  8 
insert @t select  9 
insert @t select  0 
declare @d datetime
declare @cnt int
select @d = getdate()
select @cnt= 2 *sum(cou) from
(select count(*)*count(*) cou
 from (select t1.i + t2.i + t3.i i 
       from @t t1, @t t2,  @t t3) l1
 where i between  0  and  13 
 group by i) l2
select @cnt As kolvo,datediff(ms, @d, getdate())
 
...
Рейтинг: 0 / 0
2 Дед Маздай. Приглашение на тест
    #32039053
Фотография ziktuw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя время примерно то же самое - от 0 до 16 ms, в плане твоего запроса, MiCe, оценочная стоимость в 2 раза больше.
...
Рейтинг: 0 / 0
2 Дед Маздай. Приглашение на тест
    #32039073
Фотография ziktuw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно и дальше пооптимизировать. Практически всегда 0ms и оценочная стоимость плана меньше 2-х предыдущих вариантов:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
set nocount on
declare @t table  (i int)
insert @t
 select  0 
 union select  1 
 union select  2 
 union select  3 
 union select  4 
 union select  5 
 union select  6 
 union select  7 
 union select  8 
 union select  9 
declare @d datetime
declare @cnt int
select @d = getdate()
select @cnt= 2 *sum(cou*cou) from
(select sum( 1 ) cou
 from (select t1.i + t2.i + t3.i i 
       from @t t1, @t t2, @t t3
       where t1.i + t2.i + t3.i< 14 ) l1
 group by i) l2
select @cnt As kolvo,datediff(ms, @d, getdate())
...
Рейтинг: 0 / 0
2 Дед Маздай. Приглашение на тест
    #32039088
Фотография Chicago
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если то же самое на OpenSQL для SAP R/3 переписать,
то результат будет

26000ms для варианта SergSuper

Код: 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.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
REPORT Z_SUN_TEST .

data: l_before type sy-uzeit,
      l_after type sy-uzeit,
      l_count( 5 ) type n,
      l_v1 type zzsun-zzval,
      l_v2 type zzsun-zzval,
      l_v3 type zzsun-zzval,
      l_v4 type zzsun-zzval,
      l_v5 type zzsun-zzval,
      l_v6 type zzsun-zzval,
      l_left( 2 ) type n,
      l_right( 2 ) type n,
      l_duration like sy-tabix.

get time.
l_before = sy-uzeit.

select
  t1~zzval
  t2~zzval
  t3~zzval
  t4~zzval
  t5~zzval
  t6~zzval
into
  (l_v1,
  l_v2,
  l_v3,
  l_v4,
  l_v5,
  l_v6)
from
  zzsun as t1
join
  zzsun as t2
on
  t1~zzcomp = t2~zzcomp
join
  zzsun as t3
on
  t1~zzcomp = t3~zzcomp
join
  zzsun as t4
on
  t1~zzcomp = t4~zzcomp
join
  zzsun as t5
on
  t1~zzcomp = t5~zzcomp
join
  zzsun as t6
on
  t1~zzcomp = t6~zzcomp.

  l_left  = l_v1 + l_v2 + l_v3.
  l_right = l_v4 + l_v5 + l_v6.

  if l_left = l_right.
    add  1  to l_count.
  endif.
endselect.

get time.
l_after = sy-uzeit.

CALL FUNCTION 'SWI_DURATION_DETERMINE'
EXPORTING
  START_DATE = sy-datum
  END_DATE = sy-datum
  START_TIME = l_before
  END_TIME = l_after
IMPORTING
  DURATION = l_duration.

write: l_before, / l_after, / l_duration, / l_count.



1000ms для варианта Кубенко

Код: 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.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
*& ---------------------------------------------------------------------*
 
*& Report  Z_SUN_TEST2                                                 *
*&                                                                     *
*& ---------------------------------------------------------------------*
 
*&                                                                     *
*&                                                                     *
*& ---------------------------------------------------------------------*
 

REPORT  Z_SUN_TEST2                   .

data: l_before type sy-uzeit,
      l_after type sy-uzeit,
      l_count( 5 ) type n,
      l_total( 5 ) type n,
      l_v1 type zzsun-zzval,
      l_v2 type zzsun-zzval,
      l_v3 type zzsun-zzval,
      l_right( 2 ) type n,
      l_duration like sy-tabix,
      l_i( 2 ) type n.

get time.
l_before = sy-uzeit.

while l_i <  28 .
  clear l_count.
  
  select
    t1~zzval
    t2~zzval
    t3~zzval
  into
    (l_v1,
    l_v2,
    l_v3)
  from
    zzsun as t1
  join
    zzsun as t2
  on
    t1~zzcomp = t2~zzcomp
  join
    zzsun as t3
  on
    t1~zzcomp = t3~zzcomp.
  
    l_right  = l_v1 + l_v2 + l_v3.
  
    if l_i = l_right.
      add  1  to l_count.
    endif.
  endselect.
  
  l_total = l_total + l_count **  2 .
  add  1  to l_i.
endwhile.

get time.
l_after = sy-uzeit.

CALL FUNCTION 'SWI_DURATION_DETERMINE'
EXPORTING
  START_DATE = sy-datum
  END_DATE = sy-datum
  START_TIME = l_before
  END_TIME = l_after
IMPORTING
  DURATION = l_duration.

write: l_before, / l_after, / l_duration, / l_total.


Вот такой я извращенец!!!
...
Рейтинг: 0 / 0
2 Дед Маздай. Приглашение на тест
    #32039107
Фотография MiCe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
то Dankov
ну правильно ... оптимизация... она и в африке оптимизация... ;))
...
Рейтинг: 0 / 0
2 Дед Маздай. Приглашение на тест
    #32039110
2 SergSuper
Я не пойму что вас не устраивает в предложенных алгоритмах. Дед Маздай в форуме по сравнению СУБД пригласил всех на тест по сравнению производительности различных СУБД. Вами был предложен красивый вариант с декартовым произведением (о котором мне вряд ли бы пришла в голову мысль), но он оказался не самым оптимальным, как впрочем и то что предложил я. Зато каких результатов добились Dankov и Mice!
А по поводу столбика я что-то не пойму к чему вы это? По поводу полного перебора? Ну плохой вариант не спорю, просто я хотел проверить чистый перебор для последних трех разрядов, а затем посчитать сумму квадратов на транзакте это получилось медленно, но на сях это в любом случае было бы быстрее любого варианта написанного на транзакте. А выложил этот вариант по полному перебору потому что обидно что нет массивов в T-SQL, а работа с таблицами (обновление) дико тормозная.
...
Рейтинг: 0 / 0
2 Дед Маздай. Приглашение на тест
    #32039185
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Алексей Кубенко
Меня всё устраивает, просто тест был для сервера, а не на Вашу сообразительность :)
Наоборот хотелось написать такого, чтоб он побольше задумался.
...
Рейтинг: 0 / 0
2 Дед Маздай. Приглашение на тест
    #32039268
Фотография Дед Маздай
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"Дед Маздай в форуме по сравнению СУБД пригласил всех на тест по сравнению производительности различных СУБД. Вами был предложен красивый вариант с декартовым произведением (о котором мне вряд ли бы пришла в голову мысль), но он оказался не самым оптимальным..."
Странно. Разве я говорил что-нибудь про оптимизацию запроса? По-моему, как раз наоборот: "ТРС-С - типисями, а этот простой тест под силу проверить каждому. Просто взять и выполнить, как есть, без какой бы то ни было предварительной заточки и оптимизации."
Очень хорошо, что в ходе дискуссии родились действительно красивые конструкции, но SergSuper прав: в данном случае этого не требовалось. Требовался просто голый результат as is. Спасибо.
...
Рейтинг: 0 / 0
31 сообщений из 31, показаны все 2 страниц
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / 2 Дед Маздай. Приглашение на тест
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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