powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / скорострельность TSQL и WSQL на ASA 9.02
3 сообщений из 3, страница 1 из 1
скорострельность TSQL и WSQL на ASA 9.02
    #32847980
Фотография Ggg_old
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кто-нибудь проводил замеры скорости работы одинаковых скриптов на одинаковом наборе данных но написанных в разных диалектах.
У меня есть весьма муторный скрипт (ХП), который разворачивает дерево в плоскую таблицу (весьма похожий на недавний тест из сравнения СУБД на поиск потомков в дереве). Изначально он был реализован на TSQL и использовал интенсивно временные таблицы (ввод данных во времянку/ сравнение/очистка). Я не использовал спец возможностей для работы с деревьями, какие есть в WSQL. Я переделал его на WSQL и все временные таблицы объявил как NOT TRANSACTIONAL. WITH REQURSIVE не использовал, т.е алгоритм такой-же как и в TSQL ХП.
Провел тест на скорость отработки обеих скриптов на одинаковом наборе данных с одинаковыми параметрами. ХП запкскались 10 раз. Время работы ХП около 10 сек. Особенность организации данных такова, что все потомки находились в 3 прохода и потомков много (75% от общего кол-ва листьев в дереве). Данные влезали в кэш, т.е винт не шуршал.
Негативный результат состоит в том, что TSQL скрипт в среднем оказался на 10 % БЫСТРЕЕ и во времени работы скриптов не было аномальных всплесков, т.е распределение равномерное.
Мне кажется, что такой результат является странным и я немного в замешательстве.
Понимаю, что мое заявляение без предъявления скриптов и исходного набора дынных недает возможности сделать какие либо выводы, поэтому:
1. хочется услышать мнение по этому поводу вообще (может еще кто-нибудь проводил поджобные забеги)
2. Может устроим синтетический тест?
...
Рейтинг: 0 / 0
скорострельность TSQL и WSQL на ASA 9.02
    #32848014
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ggg_oldКто-нибудь проводил замеры скорости работы одинаковых скриптов на одинаковом наборе данных но написанных в разных диалектах.
У меня есть весьма муторный скрипт (ХП), который разворачивает дерево в плоскую таблицу (весьма похожий на недавний тест из сравнения СУБД на поиск потомков в дереве). Изначально он был реализован на TSQL и использовал интенсивно временные таблицы (ввод данных во времянку/ сравнение/очистка). Я не использовал спец возможностей для работы с деревьями, какие есть в WSQL. Я переделал его на WSQL и все временные таблицы объявил как NOT TRANSACTIONAL. WITH REQURSIVE не использовал, т.е алгоритм такой-же как и в TSQL ХП.
Провел тест на скорость отработки обеих скриптов на одинаковом наборе данных с одинаковыми параметрами. ХП запкскались 10 раз. Время работы ХП около 10 сек. Особенность организации данных такова, что все потомки находились в 3 прохода и потомков много (75% от общего кол-ва листьев в дереве). Данные влезали в кэш, т.е винт не шуршал.
Негативный результат состоит в том, что TSQL скрипт в среднем оказался на 10 % БЫСТРЕЕ и во времени работы скриптов не было аномальных всплесков, т.е распределение равномерное.
Мне кажется, что такой результат является странным и я немного в замешательстве.
Понимаю, что мое заявляение без предъявления скриптов и исходного набора дынных недает возможности сделать какие либо выводы, поэтому:
1. хочется услышать мнение по этому поводу вообще (может еще кто-нибудь проводил поджобные забеги)
2. Может устроим синтетический тест?
Я конечно не могу утверждать категорически, но смысл в том, что в ASA компиляция 2-х проходная - сначала исходный код компилируется и сохраняется в удобный для ASA исходный оптимизированный код, во время выполнения он преобразовывается в байт-код. Так вот у меня очень серьезное подозрение, что во время компиляции TSQL ХП ASA тут же его преобразует в WatcomSQL, именно его и сохраняет и в дальнейшем по нему работает. В жизнь не поверю, что у этой СУБД на каждый диалект свой оптимизатор запросов. Ну а насчет рекурсий в WatcomSQL, здесь я приводил пример:
/topic/145574&pg=10#1203907
Считаю, что обработка за 2 сек в дереве 100 000 уровней вложенности очень даже неплохой результат, особенно если учесть результат Оракла - 14 сек:
/topic/145574&pg=10#1206500
...
Рейтинг: 0 / 0
скорострельность TSQL и WSQL на ASA 9.02
    #32848514
Фотография Ggg_old
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 ASCRUS:
Я попробовал алгоритм разбра дерева которое формировалось вашим скриптом (100000 элементов) в "лоб" без WITH REСURSIVE сделать на TSQL и WSQL. На этих данных особой разницы . Время выполнения около 120-125 сек. Машина Селерон 2,5 под сервер 64метра ОЗУ. Данные закешированы, винт не свопил.
Ваш скрипт который формирует дерево:
Код: 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.
CREATE TABLE "DBA"."Tree" (
"Node_id" integer NOT NULL DEFAULT autoincrement,
"Parent_id" integer NULL,
PRIMARY KEY CLUSTERED ( "Node_id" ),
PCTFREE  0 
);

// Связываем ноду с родительской
ALTER TABLE "DBA"."Tree" ADD FOREIGN KEY "Tree" ( "Parent_id" )
  REFERENCES "DBA"."Tree" ( "Node_id" ) CHECK ON COMMIT;

// Заполняем табличку на 100 000 записей
BEGIN
  DECLARE @Count int;
  SET @Count =  1 ;

  INSERT INTO Tree (Parent_id)
  VALUES (NULL);

  WHILE @Count <  100000 
  LOOP
    INSERT INTO Tree (Parent_id)
    VALUES (@@IDENTITY);

    SET @Count = @Count +  1 ;
  END LOOP;

Мой скрипт, который ищет всех потомков узла со значением NULL на TSQL.
Код: 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.
begin
	create table #childs
	(
		child int not null,
		tree_level int not null,
		pctfree  0 
	)	
		
	declare @childs_exists char( 1 )
	declare @tree_level int
	declare @max_tree_level int
	
	create clustered index ixc_tree_level on #childs (tree_level)
	//находим всех потомков узла null ->sub_childs	
	select @tree_level= 1 
	select @max_tree_level=count(*) from tree
	
	insert into #childs (child, tree_level)
		select node_id,  1  from tree
		where parent_id is null
		
	select @childs_exists='n'
	if exists(select  1  from #childs)
		select @childs_exists='y'
		
	while (@childs_exists='y' and @tree_level<=@max_tree_level)
	begin		
		//находим всех потомков childs поколения @tree_level
		insert into #childs (child, tree_level)
			select node_id, @tree_level+ 1  from tree join #childs on (parent_id=child and tree_level=@tree_level)
	
		select @childs_exists='n'
		if exists(select  1  from #childs where tree_level=@tree_level+ 1 )
		begin
			select @childs_exists='y'
			select @tree_level=@tree_level+ 1 			
		end
	end
	select count(*), max(tree_level) from #childs	
end
Т.е. в таблицу потомков на каждом шаге поиска заносятся все потомки узла и уровень их вложенности. Уровень вложенности tree_level использутеся для выборки предков на предыдущей итерации. По tree_level построен кластерный индекс.
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / скорострельность TSQL и WSQL на ASA 9.02
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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