Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 И снова парсинг XML - возможно ли ускорение?  [new]
medoed
Member

Откуда:
Сообщений: 936
Здравствуйте! Не так много имел опыта парсинга XML на уровне субд.

+
	
       DECLARE @xml XML
    -- считываем в переменную из темпоральной таблицы
	SET @xml = (SELECT Data FROM #t)

    -- парсим XML и запихиваем во времянку
	SELECT
	n.value('(../../e_date/text())[1]','datetime') e_date,
	CASE WHEN n.exist('(./n/text())[1]')=1 then n.value('(./n/text())[1]','nvarchar(255)') END as n,
	CASE WHEN n.exist('(./i/text())[1]')=1 then n.value('(./i/text())[1]','nvarchar(255)') END as i,
	CASE WHEN n.exist('(./t/text())[1]')=1 then n.value('(./t/text())[1]','nvarchar(12)')  END as t,
	INTO #temp
	FROM @xml.nodes('/e/m/in') node(n)
	-- проверяем на вхождение во временной инетервал, чтобы забирать нужные данные
	WHERE dbo.DBetw(n.value('(../../e_date/text())[1]','datetime'), @pDateS, @pDateE) = 1


При объемах файла XML порядка более 1 МБ начинает подтормаживать и парсинг занимает по 200 секунд, это долго.
Есть ли какая то возможность ускорить.
Я читал про вторичные XML индексы, стоит ли заморачиваться или на практике это профита не даст!?
Спасибо!
29 мар 17, 10:03    [20344816]     Ответить | Цитировать Сообщить модератору
 Re: И снова парсинг XML - возможно ли ускорение?  [new]
пьяный тюлень
Member

Откуда:
Сообщений: 100
Нужно всегда брать значения из текущего узла, обращение к парентам, как и другие XPath-вычисления, работают очень медленно.

	select
	e.d.value('e_date[1]','datetime') e_date,
	...
	from @xml.nodes('e') e(d)
	cross apply(select e.d.query('m/in')) x(i) 
	cross apply x.i.nodes('in') node(n)
	...
29 мар 17, 10:26    [20344942]     Ответить | Цитировать Сообщить модератору
 Re: И снова парсинг XML - возможно ли ускорение?  [new]
medoed
Member

Откуда:
Сообщений: 936
пьяный тюлень
Нужно всегда брать значения из текущего узла, обращение к парентам, как и другие XPath-вычисления, работают очень медленно.

	select
	e.d.value('e_date[1]','datetime') e_date,
	...
	from @xml.nodes('e') e(d)
	cross apply(select e.d.query('m/in')) x(i) 
	cross apply x.i.nodes('in') node(n)
	...

Спасибо, попробую!
29 мар 17, 10:33    [20344987]     Ответить | Цитировать Сообщить модератору
 Re: И снова парсинг XML - возможно ли ускорение?  [new]
энди
Member

Откуда: Киров, Россия
Сообщений: 1145
поищите тему о загрузке в MSSQL базы данных ФИАС, там обсуждалось как заливать в БД данные из огромных xml файлов, насколько помню один из файликов был свыше 10 Гб и ничего, заливается без проблем.
29 мар 17, 11:04    [20345167]     Ответить | Цитировать Сообщить модератору
 Re: И снова парсинг XML - возможно ли ускорение?  [new]
medoed
Member

Откуда:
Сообщений: 936
энди,
Спасибо!
Нашел тут упоминание, но это для MySql.
29 мар 17, 11:12    [20345230]     Ответить | Цитировать Сообщить модератору
 Re: И снова парсинг XML - возможно ли ускорение?  [new]
энди
Member

Откуда: Киров, Россия
Сообщений: 1145
https://www.sql.ru/forum/1095011/zagruzka-fias-cherez-spxmlbulkload
29 мар 17, 11:59    [20345509]     Ответить | Цитировать Сообщить модератору
 Re: И снова парсинг XML - возможно ли ускорение?  [new]
medoed
Member

Откуда:
Сообщений: 936
энди
https://www.sql.ru/forum/1095011/zagruzka-fias-cherez-spxmlbulkload

Попробовал воспользоваться советом от пользователя "пьяный тюлень" , стало работать в 100 раз быстрее. Супер, проблема решена...
29 мар 17, 13:34    [20346172]     Ответить | Цитировать Сообщить модератору
 Re: И снова парсинг XML - возможно ли ускорение?  [new]
энди
Member

Откуда: Киров, Россия
Сообщений: 1145
Ну просто мой способ рассчитан на то что файлы внешние и огромных размеров. 1Мб для XML вообще не объем :)
29 мар 17, 14:19    [20346520]     Ответить | Цитировать Сообщить модератору
 Re: И снова парсинг XML - возможно ли ускорение?  [new]
medoed
Member

Откуда:
Сообщений: 936
энди
Ну просто мой способ рассчитан на то что файлы внешние и огромных размеров. 1Мб для XML вообще не объем :)

Вам тоже респект, просто я пока к таким объемам сам не готов !
29 мар 17, 15:43    [20347120]     Ответить | Цитировать Сообщить модератору
 Re: И снова парсинг XML - возможно ли ускорение?  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
Примерно как-то так:
SELECT e_date
     , n = x.value('(./n/text())[1]', 'nvarchar(255)')
     , i = x.value('(./i/text())[1]', 'nvarchar(255)')
     , t = x.value('(./t/text())[1]', 'nvarchar(12)')
INTO #...
FROM (
    SELECT x = t.c.query('.')
         , e_date = t.c.value('(../../e_date/text())[1]', 'datetime')
    FROM @xml.nodes('/e/m/in') t(c)
) t
WHERE dbo.DBetw(e_date, @pDateS, @pDateE) = 1

Если покажите свой XML, то можно придумать как сделать быстрее.
Часть вопросов тут можно решить: https://habrahabr.ru/post/273189/
29 мар 17, 19:53    [20348453]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить