powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / 2 Дед Маздай. Приглашение на тест
25 сообщений из 31, страница 1 из 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
25 сообщений из 31, страница 1 из 2
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / 2 Дед Маздай. Приглашение на тест
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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