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

Помогите ускорить выборку из 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
14.02.2020, 17:03
    #39926810
a_voronin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли ускорить выборку из xml?
uaggster,

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

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

Так что да, в базе. По куче соображений бюрократического и не переводимого на русский (кроме матерного) характера.
...
Рейтинг: 0 / 0
14.02.2020, 17:15
    #39926822
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли ускорить выборку из xml?
...
Рейтинг: 0 / 0
14.02.2020, 17:54
    #39926845
uaggster
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли ускорить выборку из xml?
invm, да, через Openxml - в 1,5 раза быстрее получается, почти в два.
Не совсем то, что хотелось, но хоть что-то!
Спасибо.
...
Рейтинг: 0 / 0
14.02.2020, 18:36
    #39926864
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли ускорить выборку из xml?
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
14.02.2020, 19:03
    #39926884
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли ускорить выборку из xml?
uaggster

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


sqlXmlBulkLoad

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


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

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

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


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