powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Снять тормоза с запроса.
18 сообщений из 18, страница 1 из 1
Снять тормоза с запроса.
    #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
Снять тормоза с запроса.
    #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
Снять тормоза с запроса.
    #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
Снять тормоза с запроса.
    #37554766
Фотография Ggg_old
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я бы не назвал этот тест простым. Тут-то и оптимизировать нечего, да и объединения таблиц без вменяемого ключа самих с собой конечно не то, что хорошо оптимизируется. Надо оптимизировать алгоритм.
не вдаваясь пока в глуби вашего алгоритма, вот этот встроенный селект в апдейте
(select min(s.period_start) from tt s where s.period_start > tt.period_start))
нельзя вынести куда-то наружу с занесением результата во времянку?
...
Рейтинг: 0 / 0
Снять тормоза с запроса.
    #37554772
Фотография Ggg_old
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
т.е. лично мне не очень нравится апдейт таблицы значениями, которые берутся из нее же да еще и по большому диапазону значений. не знаю как оно там устроено внутри, но обеспечение ACID в таком раскладе возможно ресурсоемко само по себе. Может лучше заранее посчитать новые значения?
...
Рейтинг: 0 / 0
Снять тормоза с запроса.
    #37554807
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ggg_old,

period_start уже первичный ключ. Таблица временная, если вынесу в отдельную, всё равно потом в одну сливать. И самое главное, что с базой происходит. почему перформанс скачет. Делал сначала за 50 секунд потом на ровном месте включил оптимизатор и сделал за 3 сек.
неопределённость / назнаие - что происходит - пугает.
...
Рейтинг: 0 / 0
Снять тормоза с запроса.
    #37554817
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в таблице записаны интервалы времени - начало и продолжительность.
Я нужносделать так, что бы интервалы не прекрывались. т.е. что-бы начала+продолжителность < начало следуюшего.
Второй запрос (select count(*)) длится ещё долше - 620 секунд. Даже если вынесу результат в отделную времянку быстее похоже не будет.
Я чего-то недопонимаю.
...
Рейтинг: 0 / 0
Снять тормоза с запроса.
    #37554835
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikron (select count(*)) длится ещё долше - 620 секунд.
Извеняюсь. 260
...
Рейтинг: 0 / 0
Снять тормоза с запроса.
    #37555053
Фотография Ggg_old
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну, можно конечно профайлером посмотреть какие планы когда работает медленно.
Но в таких вычисляллках, лучше наверное захинтовать и не париться.
...
Рейтинг: 0 / 0
Снять тормоза с запроса.
    #37555060
Фотография Ggg_old
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
микрон, и можно задачу словами объяснить, а то харит заниматься реверсинжиниингом. Хотя бы на простешем статичном наборе данных. Немного смущает про "начало следующего". В sql как известно оперируют множествами, а последовательности приходится эмулировать вскими курсорами и олап-расширениями-изращениями. Может подумать в сторону их?
...
Рейтинг: 0 / 0
Снять тормоза с запроса.
    #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
Снять тормоза с запроса.
    #37557908
Фотография Ggg_old
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пробовал кластерный индекс с переброской отсортированных по времени данных в новую времянку, но большого выиграша не увидел.
думаю дальше...
Но у меня стабильное время выполнения запроса, никаких выбросов в 50 секунд нет. даже и не знаю что сказать.
...
Рейтинг: 0 / 0
Снять тормоза с запроса.
    #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
Снять тормоза с запроса.
    #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
Снять тормоза с запроса.
    #37593626
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Курсоры тоже неплохо но аналитика ещё быстрее (пример смотри выше). По памяти около 0,5 секунд. Для данного конкретного примера подходит но я всё ещё медитирую над приемлемым решением. В моей задаче аналитика не работает буквальной двумя строчками ниже, и именно там, где границы интервала задаются так-же неравенством но запись не обязательно является следующей а лежит в интервале [1..N].
В общем не торопясь медитирую.
...
Рейтинг: 0 / 0
Снять тормоза с запроса.
    #37593645
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ещё дополню. T. K. Glenn Paulley сказал что так оно и есть с неравенством в условии то приходится принять как факт и смирится, хотя я ожидал лутший результат.
...
Рейтинг: 0 / 0
Снять тормоза с запроса.
    #37593770
Фотография Ggg_old
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я тут по мотивам одного известного текста, написал свой вариант. Надеюсь оцените юмор на злобу топика, а модер мене простит.
Оригинальный идея здесь:
текст неприличный, детям и беременным не читать. Убираю. под кат.
Модератор: Не прощу. Эмоционально шутить на злобу дня можно и на литературном языке.
...
Рейтинг: 0 / 0
Снять тормоза с запроса.
    #37594464
Фотография Ggg_old
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Эхх, такую литературную красоту замодерели :(
Но согласись, что вышло задороно ;)
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Снять тормоза с запроса.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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