Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Оптимизация запроса по XML / 6 сообщений из 6, страница 1 из 1
10.09.2010, 18:15
    #36841057
indicatrix
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса по XML
Доброго времени суток господа!

Из-за долгого выполнения ХП у меня возникла необходимость переделать хранимую процедуру которая делает следующее:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
	INSERT INTO X(ID, K, R)(
	SELECT ID, X.K, X.R
	FROM TP, xmltable('$xml_data/root' passing TASK_DATA AS "xml_data"
	columns
		ID BIGINT path	'//f[@f_id="[color=red]1[/color]"]/@fid'
		, K float path	'//id[@i_id="[color=red]10[/color]"]/id_value'
		, R float path	'//id[@i_id="[color=red]11[/color]"]/id_value'
	) as X
	WHERE ...
	);

	INSERT INTO X(ID, K, R)(
	SELECT ID, X.K, X.R
	FROM TP, xmltable('$xml_data/root' passing TASK_DATA AS "xml_data"
	columns
		ID BIGINT path	'//f[@f_id="[color=red]2[/color]"]/@fid'
		, K float path	'//id[@i_id="[color=red]20[/color]"]/id_value'
		, R float path	'//id[@i_id="[color=red]21[/color]"]/id_value'
	) as X
	WHERE ...
	);
        ....
        N раз выполяется инсерт

Что можно сделать в моем случае?
Могу я один раз заселектить в переменную XML благо он одинаковый (данные идентичны) для всех этих инсертов, а потом делать инсерт только обращаясь к этому XML и не обращаясь к таблице?

Я попробовал создать такую, но что-то не получается.
Не могу разобраться в сообщении об ошибке:
"The result of an intermediate step expression in an XQuery path expression contains an atomic value"

Вот возможный код решения проблемы:
Код: 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.
	DECLARE ss XML;
	DECLARE C1 CURSOR FOR
	SELECT TASK_DATA
	FROM TP
	WHERE ...;

	OPEN C1;
	FETCH C1 INTO ss;
	CLOSE C1;

	INSERT INTO X(ID, K, R)(
	SELECT ID, X.K, X.R
	FROM xmltable(
	'$xml_data/root' passing ss AS "xml_data"
	columns
		ID BIGINT path	'//f[@f_id="[color=red]1[/color]"]/@fid'
		, K float path	'//id[@i_id="[color=red]10[/color]"]/id_value'
		, R float path	'//id[@i_id="[color=red]11[/color]"]/id_value'
	) as X);

	INSERT INTO X(ID, K, R)(
	SELECT ID, X.K, X.R
	FROM xmltable(
	'$xml_data/root' passing ss AS "xml_data"
	columns
		ID BIGINT path	'//f[@f_id="[color=red]2[/color]"]/@fid'
		, K float path	'//id[@i_id="[color=red]20[/color]"]/id_value'
		, R float path	'//id[@i_id="[color=red]21[/color]"]/id_value'
	) as X);

        . . . 	


Заранее всех благодарю за помощь!
...
Рейтинг: 0 / 0
11.09.2010, 13:31
    #36841705
indicatrix
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса по XML
Не совсем понятно, можно ли делать такие запросы:
Код: plaintext
1.
2.
3.
SELECT ID, X.K, X.R
	FROM xmltable(
        ...

Везде в примерах стоит обычная рел.таблица, а потом ХМЛ

Код: plaintext
1.
2.
3.
SELECT ID, X.K, X.R
	FROM TP, xmltable(
        ...
...
Рейтинг: 0 / 0
12.09.2010, 15:15
    #36842362
BuryCommoner
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса по XML
indicatrixЧто можно сделать в моем случае?
Можно попробовать отказаться от xmltable().
Код: plaintext
1.
2.
3.
SELECT xmlcast(xmlquery('$xml_data/root//f[@f_id="[color=red]1[/color]"]/@fid' passing TASK_DATA AS "xml_data") as bigint) as ID,
xmlcast(xmlquery('$xml_data/root//id[@i_id="[color=red]10[/color]"]/id_value' passing TASK_DATA AS "xml_data") as float) as K,
xmlcast(xmlquery('$xml_data/root//id[@i_id="[color=red]11[/color]"]/id_value' passing TASK_DATA AS "xml_data") as float) as R
FROM TP
indicatrixМогу я один раз заселектить в переменную XML благо он одинаковый (данные идентичны) для всех этих инсертов, а потом делать инсерт только обращаясь к этому XML и не обращаясь к таблице? ...
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SELECT TASK_DATA
INTO v_xml
FROM TP
WHERE ...;

SELECT ID, K, R
FROM xmltable('$xml_data/root' passing v_xml AS "xml_data"
columns
ID BIGINT path	'//f[@f_id="[color=red]1[/color]"]/@fid'
, K float path	'//id[@i_id="[color=red]10[/color]"]/id_value'
, R float path	'//id[@i_id="[color=red]11[/color]"]/id_value'
) as X
WHERE ...
Только разницы по скорости не будет.
indicatrixНе совсем понятно, можно ли делать такие запросы: ...
Везде в примерах стоит обычная рел.таблица, а потом ХМЛ
Можно. Просто, чтоб не отвлекаться на инициализацию переменных, в примерах берутся готовые xml-ки из таблиц.
...
Рейтинг: 0 / 0
13.09.2010, 18:31
    #36844200
indicatrix
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса по XML
BuryCommonerindicatrixЧто можно сделать в моем случае?
Можно попробовать отказаться от xmltable().
Код: plaintext
1.
2.
3.
SELECT xmlcast(xmlquery('$xml_data/root//f[@f_id="[color=red]1[/color]"]/@fid' passing TASK_DATA AS "xml_data") as bigint) as ID,
xmlcast(xmlquery('$xml_data/root//id[@i_id="[color=red]10[/color]"]/id_value' passing TASK_DATA AS "xml_data") as float) as K,
xmlcast(xmlquery('$xml_data/root//id[@i_id="[color=red]11[/color]"]/id_value' passing TASK_DATA AS "xml_data") as float) as R
FROM TP
indicatrixМогу я один раз заселектить в переменную XML благо он одинаковый (данные идентичны) для всех этих инсертов, а потом делать инсерт только обращаясь к этому XML и не обращаясь к таблице? ...
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SELECT TASK_DATA
INTO v_xml
FROM TP
WHERE ...;

SELECT ID, K, R
FROM xmltable('$xml_data/root' passing v_xml AS "xml_data"
columns
ID BIGINT path	'//f[@f_id="[color=red]1[/color]"]/@fid'
, K float path	'//id[@i_id="[color=red]10[/color]"]/id_value'
, R float path	'//id[@i_id="[color=red]11[/color]"]/id_value'
) as X
WHERE ...
Только разницы по скорости не будет.

Спасибо большое, получилось,
и в скорости действительно нет разницы.
А как можно увеличить перфоманс?

Куда идут основные затраты?
На инсерт в таблицу или селект из ХМЛ?
...
Рейтинг: 0 / 0
15.09.2010, 16:58
    #36848508
BuryCommoner
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса по XML
Судя по своему опыту, функция xmltable() неэффективно написана. На мелких xml-ах летает, но с увеличением размера скорость падает катастрофически. Грузил xml-ку размером несколько метров. Время выполнения было в пределах минут. При xml-ке размером в пару десятков метров, время выполнения возросло в порядки часов. О_о Разумной альтернативы не нашли. Решили парсить на джаве. Правда до рабочего варианта не успели дойти. Из-за организационных проблем разработку БД приостановили.
...
Рейтинг: 0 / 0
15.09.2010, 18:11
    #36848772
indicatrix
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса по XML
BuryCommonerСудя по своему опыту, функция xmltable() неэффективно написана. На мелких xml-ах летает, но с увеличением размера скорость падает катастрофически. Грузил xml-ку размером несколько метров. Время выполнения было в пределах минут. При xml-ке размером в пару десятков метров, время выполнения возросло в порядки часов. О_о Разумной альтернативы не нашли. Решили парсить на джаве. Правда до рабочего варианта не успели дойти. Из-за организационных проблем разработку БД приостановили.

Спасибо за совет!
Значит основное время уходит на обработку ХМЛ.
Попробую реализовать без xmltable.
...
Рейтинг: 0 / 0
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Оптимизация запроса по XML / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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