Гость
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Снять тормоза с запроса. / 18 сообщений из 18, страница 1 из 1
01.12.2011, 16:17
    #37554441
mikron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Снять тормоза с запроса.
посмотрите пожалуйста, почему тормоза, или чего я непонимаю.
Написал вот простой тест и на последний апдейт у меня на АСА 12.0.1.3406 тратится 53 сек.
Где я неправ или опять в сапорт?


Код: 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.
create global temporary table tt (period_start timestamp not null, period_len numeric( 10 , 0 ), primary key (period_start))
not transactional -- on commit preserve rows
/

begin
	declare @vi		integer;
	declare @vt		timestamp;
	
	delete from tt;
	
	set @vi =  20000 ;
	while @vi >  0  loop
		set @vt = dateadd(second, truncnum( 365 * 24 * 60 * 60  *rand(),  0 ), '2010-01-01' );
		insert into tt (period_start, period_len)
		on existing skip
		values (@vt, truncnum( 60 * 60 *rand(),  0 ));
        set @vi = @vi -  1 ;
	end loop;
	
	insert into tt (period_start, period_len)
	on existing skip
	select dateadd(second, truncnum( 60 *rand(),  0 ), period_start), period_len -  60 
	from tt
	where period_len >  60 
	order by period_start, period_len;
	commit;
end;
/

update tt 
set period_len = lesser(period_len, coalesce(
			datediff(second, period_start, (select max(s.period_start) from tt s where s.period_start > tt.period_start))
			, period_len))
/

...
Рейтинг: 0 / 0
01.12.2011, 16:46
    #37554515
mikron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Снять тормоза с запроса.
в таблице ~40000 записей и после несколких запусков тормоза слетели.
Сейчас апдейт проходит за 3 сек. Обясните, в чём дело?
И вот-так всё равно тормозит.
Код: plaintext
1.
2.
3.
4.
5.
6.
select count(*) from (
    select s1.period_start, min(s2.period_start) as max_len
    from tt s1, tt s2
    where s2.period_start > s1.period_start
    group by s1.period_start 
) ss
...
Рейтинг: 0 / 0
01.12.2011, 16:49
    #37554520
mikron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Снять тормоза с запроса.
в первом варианте мах надо на мин заменить.

Код: 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.
drop table if exists tt
/

create local temporary table tt (period_start timestamp not null, period_len numeric( 10 , 0 ), primary key (period_start))
not transactional
/

begin
	declare @vi		integer;
	declare @vt		timestamp;
	
	delete from tt;
	
	set @vi =  20000 ;
	while @vi >  0  loop
		set @vt = dateadd(second, truncnum( 365 * 24 * 60 * 60  *rand(),  0 ), '2010-01-01' );
		insert into tt (period_start, period_len)
		on existing skip
		values (@vt, truncnum( 60 * 60 *rand(),  0 ));
        set @vi = @vi -  1 ;
	end loop;
	
	insert into tt (period_start, period_len)
	on existing skip
	select dateadd(second, truncnum( 60 *rand(),  0 ), period_start), period_len -  60 
	from tt
	where period_len >  60 
	order by period_start, period_len;
	commit;
end;
/

select count(*) from tt
/

update tt 
set period_len = lesser(period_len, coalesce(
			datediff(second, period_start, (select min(s.period_start) from tt s where s.period_start > tt.period_start))
			, period_len))
/

select count(*) from (
    select s1.period_start, min(s2.period_start) as max_len
    from tt s1, tt s2
    where s2.period_start > s1.period_start
    group by s1.period_start 
) ss
/

select period_start, last_value(period_start) over (order by period_start rows between current row and  1  following)
from tt
/
...
Рейтинг: 0 / 0
01.12.2011, 18:31
    #37554766
Ggg_old
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Снять тормоза с запроса.
Я бы не назвал этот тест простым. Тут-то и оптимизировать нечего, да и объединения таблиц без вменяемого ключа самих с собой конечно не то, что хорошо оптимизируется. Надо оптимизировать алгоритм.
не вдаваясь пока в глуби вашего алгоритма, вот этот встроенный селект в апдейте
(select min(s.period_start) from tt s where s.period_start > tt.period_start))
нельзя вынести куда-то наружу с занесением результата во времянку?
...
Рейтинг: 0 / 0
01.12.2011, 18:33
    #37554772
Ggg_old
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Снять тормоза с запроса.
т.е. лично мне не очень нравится апдейт таблицы значениями, которые берутся из нее же да еще и по большому диапазону значений. не знаю как оно там устроено внутри, но обеспечение ACID в таком раскладе возможно ресурсоемко само по себе. Может лучше заранее посчитать новые значения?
...
Рейтинг: 0 / 0
01.12.2011, 18:54
    #37554807
mikron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Снять тормоза с запроса.
Ggg_old,

period_start уже первичный ключ. Таблица временная, если вынесу в отдельную, всё равно потом в одну сливать. И самое главное, что с базой происходит. почему перформанс скачет. Делал сначала за 50 секунд потом на ровном месте включил оптимизатор и сделал за 3 сек.
неопределённость / назнаие - что происходит - пугает.
...
Рейтинг: 0 / 0
01.12.2011, 19:00
    #37554817
mikron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Снять тормоза с запроса.
в таблице записаны интервалы времени - начало и продолжительность.
Я нужносделать так, что бы интервалы не прекрывались. т.е. что-бы начала+продолжителность < начало следуюшего.
Второй запрос (select count(*)) длится ещё долше - 620 секунд. Даже если вынесу результат в отделную времянку быстее похоже не будет.
Я чего-то недопонимаю.
...
Рейтинг: 0 / 0
01.12.2011, 19:12
    #37554835
mikron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Снять тормоза с запроса.
mikron (select count(*)) длится ещё долше - 620 секунд.
Извеняюсь. 260
...
Рейтинг: 0 / 0
01.12.2011, 22:47
    #37555053
Ggg_old
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Снять тормоза с запроса.
ну, можно конечно профайлером посмотреть какие планы когда работает медленно.
Но в таких вычисляллках, лучше наверное захинтовать и не париться.
...
Рейтинг: 0 / 0
01.12.2011, 22:56
    #37555060
Ggg_old
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Снять тормоза с запроса.
микрон, и можно задачу словами объяснить, а то харит заниматься реверсинжиниингом. Хотя бы на простешем статичном наборе данных. Немного смущает про "начало следующего". В sql как известно оперируют множествами, а последовательности приходится эмулировать вскими курсорами и олап-расширениями-изращениями. Может подумать в сторону их?
...
Рейтинг: 0 / 0
02.12.2011, 18:30
    #37556762
mikron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Снять тормоза с запроса.
Ggg_old,

аналитику уже рассматривал.
Код: plaintext
1.
2.
select period_start, last_value(period_start) over (order by period_start rows between current row and 1 following)
from tt



Есть набор интервалов времени, каждый описывается <начало_интервала; продолжителность>. Интервалы могут перекрыватся:
Код: plaintext
1.
2.
3.
4.
5.
Time		Length
10:00:00	10
10:00:30	60
10:01:00	30
10:01:10	10

Моя задача "урезать" продолжителность интервала,
так, что бы они (интервалы) болше не прекрывались.

Код: plaintext
1.
2.
3.
4.
5.
Time		Length
10:00:00	10
10:00:30	30
10:01:00	10
10:01:10	10

П.С. И кстати, судя по твоему профилю, мы в схожих областях работаем.
...
Рейтинг: 0 / 0
03.12.2011, 23:19
    #37557908
Ggg_old
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Снять тормоза с запроса.
пробовал кластерный индекс с переброской отсортированных по времени данных в новую времянку, но большого выиграша не увидел.
думаю дальше...
Но у меня стабильное время выполнения запроса, никаких выбросов в 50 секунд нет. даже и не знаю что сказать.
...
Рейтинг: 0 / 0
08.12.2011, 00:49
    #37564223
Ggg_old
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Снять тормоза с запроса.
микроныч, после почти часовой стоячей медитации, расширив сознание и обратившись к сокральному заннию предков мне открылось древнее кон-фу стиля "фокс-про-цюань" ;) Вроде как ускорился самый проблемный кусок в 2 раза. Я правда не сильно проверял точность работы алгоритма, но на первый взгляд все ок.
кусок 1, ваш: время более 4сек.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
drop table if exists tt2;
create local temporary table tt2 
(
	period_start timestamp, 
	period_len numeric(10,0)
) not transactional;

insert into tt2 (period_start, period_len) 
	select period_start, lesser(period_len, coalesce(
			datediff(second, period_start, (select min(s.period_start) from tt s where s.period_start > tt.period_start))
			, period_len)) 
	from tt order by period_start asc; 



кусок мой (
...
Рейтинг: 0 / 0
08.12.2011, 00:51
    #37564225
Ggg_old
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Снять тормоза с запроса.
кусок мой (Ninja SCROLL), 1.9cек
Код: sql
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.
drop table if exists tt2;
create local temporary table tt2 
(
	period_start timestamp, 
	period_len numeric(10,0)
) not transactional;

begin	
	declare @period_start timestamp;
	declare @period_len numeric(10,0);
	declare @period_start_prev timestamp;
	declare @period_len_prev numeric(10,0);
	declare @first_row char(1);
	declare @new_period_len numeric(10,0);

	declare c_mikron no scroll
		cursor for select period_start, period_len from tt order by period_start asc;

	set @first_row='y';
	open c_mikron;
	lp: LOOP
      FETCH NEXT c_mikron into @period_start, @period_len;
      IF SQLCODE <> 0 THEN LEAVE lp END IF;
      IF @first_row='y' THEN
			set @period_start_prev=@period_start;
			set @period_len_prev=@period_len;
			set @first_row='n';
			continue lp;			
		END IF;
		set @new_period_len=lesser(@period_len_prev, datediff(second, @period_start_prev, @period_start));
		insert into tt2 (period_start, period_len) values (@period_start_prev, @new_period_len);
		
		set @period_start_prev=@period_start;
		set @period_len_prev=@period_len;
   END LOOP;
   CLOSE c_mikron;
end;
...
Рейтинг: 0 / 0
26.12.2011, 15:14
    #37593626
mikron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Снять тормоза с запроса.
Курсоры тоже неплохо но аналитика ещё быстрее (пример смотри выше). По памяти около 0,5 секунд. Для данного конкретного примера подходит но я всё ещё медитирую над приемлемым решением. В моей задаче аналитика не работает буквальной двумя строчками ниже, и именно там, где границы интервала задаются так-же неравенством но запись не обязательно является следующей а лежит в интервале [1..N].
В общем не торопясь медитирую.
...
Рейтинг: 0 / 0
26.12.2011, 15:23
    #37593645
mikron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Снять тормоза с запроса.
Ещё дополню. T. K. Glenn Paulley сказал что так оно и есть с неравенством в условии то приходится принять как факт и смирится, хотя я ожидал лутший результат.
...
Рейтинг: 0 / 0
26.12.2011, 16:23
    #37593770
Ggg_old
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Снять тормоза с запроса.
я тут по мотивам одного известного текста, написал свой вариант. Надеюсь оцените юмор на злобу топика, а модер мене простит.
Оригинальный идея здесь:
текст неприличный, детям и беременным не читать. Убираю. под кат.
Модератор: Не прощу. Эмоционально шутить на злобу дня можно и на литературном языке.
...
Рейтинг: 0 / 0
26.12.2011, 23:39
    #37594464
Ggg_old
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Снять тормоза с запроса.
Эхх, такую литературную красоту замодерели :(
Но согласись, что вышло задороно ;)
...
Рейтинг: 0 / 0
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Снять тормоза с запроса. / 18 сообщений из 18, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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