Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / 2 Дед Маздай. Приглашение на тест / 25 сообщений из 31, страница 1 из 2
25.07.2002, 16:31:05
    #32038819
2 Дед Маздай. Приглашение на тест
Небольшая модификация алгоритма 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
25.07.2002, 16:39:13
    #32038821
Maxx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
2 Дед Маздай. Приглашение на тест
Я не Дед Мазай но все же 110ms
...
Рейтинг: 0 / 0
25.07.2002, 16:40:08
    #32038822
Maxx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
2 Дед Маздай. Приглашение на тест
93 ms
...
Рейтинг: 0 / 0
25.07.2002, 16:44:23
    #32038823
Алекс_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
2 Дед Маздай. Приглашение на тест
что за тачка?
у меня 80 стабильно.
Я сейчас долго вспоминал тервер, но что то так и не смог я к этой задаче его привязать поэтому только смог так модифицировать. Но кажется что можно в лоб при помощи тервера посчитать.
...
Рейтинг: 0 / 0
25.07.2002, 16:48:43
    #32038825
Rom
Rom
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
2 Дед Маздай. Приглашение на тест
от 60 до 80
...
Рейтинг: 0 / 0
25.07.2002, 16:52:03
    #32038828
Hibernate
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
2 Дед Маздай. Приглашение на тест
63 (PIII-1Гц)
...
Рейтинг: 0 / 0
25.07.2002, 17:00:54
    #32038832
Зайцев Фёдор
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
2 Дед Маздай. Приглашение на тест
80-90
P3 933
...
Рейтинг: 0 / 0
25.07.2002, 17:01:05
    #32038833
tyblin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
2 Дед Маздай. Приглашение на тест
40
...
Рейтинг: 0 / 0
25.07.2002, 17:38:28
    #32038847
2 Дед Маздай. Приглашение на тест
2 tyblin
У тебя наверно тачка помощней моей будет. Но все же я еще оптимизировал и теперь результат c вероятностью 1/2 - 40ms, 50ms опять же на P3-800.
...
Рейтинг: 0 / 0
25.07.2002, 17:50:36
    #32038851
tyblin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
2 Дед Маздай. Приглашение на тест
MSDE на PIV Northwood 2 Gh 256 Mb
...
Рейтинг: 0 / 0
25.07.2002, 17:58:54
    #32038858
Ал
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
2 Дед Маздай. Приглашение на тест
Ну конечно спору нет 2Ghz против моих 800 Mhz.
Но все же результата я добился такого же 40 ms как и на 2 Ghz немного подумав над задачей.
...
Рейтинг: 0 / 0
25.07.2002, 18:12:07
    #32038866
Rom
Rom
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
2 Дед Маздай. Приглашение на тест
от 60 до 80
...
Рейтинг: 0 / 0
25.07.2002, 18:51:19
    #32038873
2 Дед Маздай. Приглашение на тест
Вот более оптимизированный алгоритм подсчета (можно конечно было расширенную сделать, но влом понятное дело быстрее будет хочется на 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
25.07.2002, 20:21:22
    #32038899
Maxx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
2 Дед Маздай. Приглашение на тест
Все вылезли из сервера результат - 34-36ms
...
Рейтинг: 0 / 0
25.07.2002, 20:56:37
    #32038904
SergCat
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
2 Дед Маздай. Приглашение на тест
Да, зато как разочаровался я в MSSQL по поводу отсутствия на T-SQL массивов, если раньше я считал на хрена массивы когда есть таблицы и чем они хуже массивов. На первый взгляд они лучше, но время работы очень медленное.

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

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

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

Кстати мой самый первый сервер ( P90, MS SQL 4) считал это 38 сек.
...
Рейтинг: 0 / 0
26.07.2002, 09:44:59
    #32038950
Sanek
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
2 Дед Маздай. Приглашение на тест
130 (227 Mhz 280 Ram)
...
Рейтинг: 0 / 0
26.07.2002, 10:01:35
    #32038957
MiCe
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
2 Дед Маздай. Приглашение на тест
у меня от 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
26.07.2002, 10:07:36
    #32038961
MiCe
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
2 Дед Маздай. Приглашение на тест
да и притом что с времменной таблицей 30-60.....
и всетаки она в памяти.... если конечно ее хватает.. ;))
всем бай....
...
Рейтинг: 0 / 0
26.07.2002, 10:28:42
    #32038977
ComeRun
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
2 Дед Маздай. Приглашение на тест
Server peregruzhen(pashet 2 mesyaca bez reboot), okolo 20 TS client, ezheminutno startujut 15 jobs... Tem ne menee - 16ms.
...
Рейтинг: 0 / 0
26.07.2002, 11:15:40
    #32038994
ziktuw
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
2 Дед Маздай. Приглашение на тест
Этот алгоритм можно изменить, чтобы он считал от 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
26.07.2002, 11:57:33
    #32039019
MiCe
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
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  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
26.07.2002, 12:39:30
    #32039053
ziktuw
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
2 Дед Маздай. Приглашение на тест
Хотя время примерно то же самое - от 0 до 16 ms, в плане твоего запроса, MiCe, оценочная стоимость в 2 раза больше.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / 2 Дед Маздай. Приглашение на тест / 25 сообщений из 31, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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