powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Можно ли ускорить выборку из xml?
12 сообщений из 12, страница 1 из 1
Можно ли ускорить выборку из xml?
    #39926806
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уважаемые коллеги, приветствую!

Помогите ускорить выборку из xml!
Сам xml - предельно прост:
Код: 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.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
declare @inp as xml = N'<row>
  <a>ИВАНИЧЕВ</a>
  <a>АЛЕКСАНДР</a>
  <a>ИВАНОВИЧ</a>
  <a>28.08.1973</a>
  <a />
  <a>00821000086-0000</a>
  <a />
  <a />
  <a>2.1</a>
</row>
<row>
  <a>БАБКИНА</a>
  <a>ИРИНА</a>
  <a>ИВАНОВНА</a>
  <a>22.12.1973</a>
  <a />
  <a>00821000087-0000</a>
  <a />
  <a />
  <a>2.2</a>
</row>
<row>
  <a>ГРЕЗЕВА</a>
  <a>ТАТЬЯНА</a>
  <a>ЮРЬЕВНА</a>
  <a>30.04.1981</a>
  <a />
  <a>00821000088-0000</a>
  <a />
  <a />
  <a>2.1</a>
</row>
<row>
  <a>ЗАКАР</a>
  <a>МАРИЯ</a>
  <a>ВИКТОРОВНА</a>
  <a>08.11.1971</a>
  <a />
  <a>00821000089-0001</a>
  <a />
  <a />
  <a>3.3</a>
</row>'

Select 
	ROW_NUMBER() over (order by 1/0) N
	,Upper(Ltrim(Rtrim(t.n.value('(a)[1]', 'varchar(40)')))) [fam]
	,Upper(Ltrim(Rtrim(t.n.value('(a)[2]', 'varchar(40)')))) [im]
	,Upper(Ltrim(Rtrim(t.n.value('(a)[3]', 'varchar(40)')))) [ot]
	,Try_convert(date, Ltrim(Rtrim(t.n.value('(a)[4]', 'varchar(20)'))), 104) [dr]
	,Ltrim(Rtrim(t.n.value('(a)[5]', 'varchar(40)'))) [n1]
	,Ltrim(Rtrim(t.n.value('(a)[6]', 'varchar(40)'))) [n2]
	,Ltrim(Rtrim(t.n.value('(a)[7]', 'varchar(40)'))) [otdel]
	,Ltrim(Rtrim(t.n.value('(a)[8]', 'varchar(40)'))) [phone]
	,Ltrim(Rtrim(t.n.value('(a)[9]', 'varchar(40)'))) [ver]
into #inp
	from @inp.nodes('row') t(n)



Проблема в том, что в типовом хмл - порядка 1-2 миллионов <row>.
И его отработка длится минут 10-15.
Нельзя ли хоть как-то подсакратить?
@inp - это входящий параметр хранимки.

Что-нибудь можно сделать? По частям распарсить, я не знаю, в поле временной таблицы засунуть, и индекс построить, как типизированный хмл объявить, хоть что-нибудь, я не знаю.
Подскажите, дайте пример, пожалуйста!

Хочется ускорения раз в 10. Но буду рад, если хоть как-то...
...
Рейтинг: 0 / 0
Можно ли ускорить выборку из xml?
    #39926810
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uaggster,

А вам это надо в БД делать? Вообще есть вещи типа XSLT или LinqToXml. При делании их можно засунуть в CLR. Предкомпилированный Xslt довольно быстро может парзить.
...
Рейтинг: 0 / 0
Можно ли ускорить выборку из xml?
    #39926816
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uaggster,

ETL задачи надо решать внешними средствами.
...
Рейтинг: 0 / 0
Можно ли ускорить выборку из xml?
    #39926819
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
a_voronin, это жуткое легаси, на самом деле. Они так параметры для выборки передают, табличные.
Только вначале речь шла о паре сотен - тысяче записей, а потом постепенно доросло до миллионов, и теперь уперлось в порог, когда хранимка валится по таймауту, причем сам таймаут увеличить нельзя, он где-то в дебрях сервера приложений зарыт.
Нужно срочно что-то закостылить, чтобы хоть как-то работало.

Так что да, в базе. По куче соображений бюрократического и не переводимого на русский (кроме матерного) характера.
...
Рейтинг: 0 / 0
Можно ли ускорить выборку из xml?
    #39926822
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Можно ли ускорить выборку из xml?
    #39926845
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm, да, через Openxml - в 1,5 раза быстрее получается, почти в два.
Не совсем то, что хотелось, но хоть что-то!
Спасибо.
...
Рейтинг: 0 / 0
Можно ли ускорить выборку из xml?
    #39926864
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uaggster,

Код: 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.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
declare @inp as xml = N'<row>
  <a>ИВАНИЧЕВ</a>
  <a>АЛЕКСАНДР</a>
  <a>ИВАНОВИЧ</a>
  <a>28.08.1973</a>
  <a />
  <a>00821000086-0000</a>
  <a />
  <a />
  <a>2.1</a>
</row>
<row>
  <a>БАБКИНА</a>
  <a>ИРИНА</a>
  <a>ИВАНОВНА</a>
  <a>22.12.1973</a>
  <a />
  <a>00821000087-0000</a>
  <a />
  <a />
  <a>2.2</a>
</row>
<row>
  <a>ГРЕЗЕВА</a>
  <a>ТАТЬЯНА</a>
  <a>ЮРЬЕВНА</a>
  <a>30.04.1981</a>
  <a />
  <a>00821000088-0000</a>
  <a />
  <a />
  <a>2.1</a>
</row>
<row>
  <a>ЗАКАР</a>
  <a>МАРИЯ</a>
  <a>ВИКТОРОВНА</a>
  <a>08.11.1971</a>
  <a />
  <a>00821000089-0001</a>
  <a />
  <a />
  <a>3.3</a>
</row>';

declare @x xml, @c int = 250000;
declare @g int, @1 varchar(100), @2 varchar(100), @3 varchar(100), @4 varchar(100), @5 varchar(100), @6 varchar(100), @7 varchar(100), @8 varchar(100);

-- миллион row
select
 @x = t.x
from
 (
  select top (@c)
   @inp as [*]
  from
   master.dbo.spt_values a cross join
   master.dbo.spt_values b
  for xml path(''), type
 ) t(x);

set statistics time on;

with s as
(
 select
  t.n.value('.', 'varchar(100)') as v,
  (row_number() over (order by 1/0) - 1) / 9 as g,
  (row_number() over (order by 1/0) - 1) % 9 as n
 from
  @x.nodes('row/a') t(n)
)
select
 @1 = max(case when n = 0 then v end),
 @2 = max(case when n = 1 then v end),
 @3 = max(case when n = 2 then v end),
 @4 = max(case when n = 3 then v end),
 @5 = max(case when n = 4 then v end),
 @6 = max(case when n = 5 then v end),
 @7 = max(case when n = 6 then v end),
 @8 = max(case when n = 7 then v end)
from
 s
group by
 g;

set statistics time off;


Код: plaintext
1.
2.
 SQL Server Execution Times:
   CPU time = 48578 ms,  elapsed time = 55590 ms.
...
Рейтинг: 0 / 0
Можно ли ускорить выборку из xml?
    #39926884
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uaggster

Хочется ускорения раз в 10. Но буду рад, если хоть как-то...


sqlXmlBulkLoad

ЗЫ. Потоковые парсеры XML раз в сто быстрее.
...
Рейтинг: 0 / 0
Можно ли ускорить выборку из xml?
    #39926932
Фотография Megabyte
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, если на входе xml-файл, то через bulkload можно. Будет в 10 раз быстрее.
...
Рейтинг: 0 / 0
Можно ли ускорить выборку из xml?
    #39926970
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Megabyte, в том то и дело, что это входной параметр хранимой процедуры.
Теоретически, его можно сохранить в filetable, а потом натравить на него парсер, а потом парсить в динамически созданную постоянную таблицу, но это хардкор, я б сказал!
...
Рейтинг: 0 / 0
Можно ли ускорить выборку из xml?
    #39927002
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uaggster
Megabyte, в том то и дело, что это входной параметр хранимой процедуры.
Теоретически, его можно сохранить в filetable, а потом натравить на него парсер, а потом парсить в динамически созданную постоянную таблицу, но это хардкор, я б сказал!


sqlXmlBulkLoad сам может создать все таблицы. Например, в tempdb. Схема только нужна.
Работать он может не с файла, а с потока, в том числе и с потока из базы.
AdoDB.Stream.

Все DOM-парсеры отдыхают.
...
Рейтинг: 0 / 0
Можно ли ускорить выборку из xml?
    #39927019
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uaggster,

filetable не очень хорошая тема, лучше сохраните параметр в глобальную временную таблицу, отгрузите ее в файл через xp_cmdshell bcp, затем примените sqlXmlBulkLoad. Но это всё равно для извращенцев. Лучше сразу из приложения отгружать в файл.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Можно ли ускорить выборку из xml?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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