что делать если хмл параметр процедуры передается медленно

student-uni
Дата: 03.02.2009 17:39:44
приведенный ниже код работает при большом количестве записей (20-30 тыс)
очень медленно.
Данные из хмл параметра передаются в таблицу и дальше идет работа
с этой временной таблицей.
Потеря времени идет именно при большом обьеме данных в ХМЛ параметре.

Есть ли способ как то ускорить процесс ?
Спасибо

П.с. как вариант думал уже идти не через хмл параметр, а копировать в физическую
таблицу через BulkCopy (.NET) и синхронизировать севисом доступ.
Но наверно есть более простое решение.

CREATE PROCEDURE [dbo].[myProc] 
@xml XML 
AS
IF OBJECT_ID('tempdb..#inputData') IS NOT NULL
	DROP TABLE #inputData

CREATE TABLE #inputData 
( 
    Filed1 nvarchar(400), 
    Filed2 nvarchar(400) 
)



INSERT #inputData

SELECT
ParamValues.ID.value('Filed1[1]','NVARCHAR(100)') AS Filed1,
ParamValues.ID.value('Filed2[1]','NVARCHAR(100)') AS Filed2
FROM @xml.nodes('//Datas/Data') as ParamValues(ID)

DeColo®es
Дата: 03.02.2009 18:21:38
0) Порадовало название ... параметр процедуры передается медленно. :)
Как интересно, замерить скорость передачи параметра.

1) При использовании большого числа values в одном запросе, по моим замерам эффективнее использовать OPENXML
Mnior
Дата: 03.02.2009 21:40:58
Интересные игры с бубном:
student-uni
IF OBJECT_ID('tempdb..#inputData') IS NOT NULL
	DROP TABLE #inputData
CREATE TABLE #inputData 
...
student-uni
FROM @xml.nodes('//Datas/Data') as ParamValues(ID)
Не доводилось нагружать таким объёмом, но всё же:
Стоит ли нагружать парсер поиском в глубину '//' ? Может стоит жёстко путь указать?
Если у вас там типа дерева, то и SQLXMLBulck ваще не катит.
OPENXML (не говоря о скорости) удобнее, чем писать постоянно '[1]', если вы генерите XML из DataTable (.Net), то могли бы прописать в ColumnMapping тип MappingType.Attribute (гипотетически это должно быть проще парсеру, ну объём данных точно меньше был бы).

И не надо играться с "сервисом синхронизации доступа":
BOL (.Net)
SqlBulkCopy: You can bulk-copy data to a temporary table by using a value such as tempdb..#table or tempdb.<owner>.#table for the DestinationTableName property.
student-uni
Дата: 04.02.2009 11:44:34
автор
Интересные игры с бубном
IF OBJECT_ID('tempdb..#inputData') IS NOT NULL
	DROP TABLE #inputData
CREATE TABLE #inputData 

что здесь то не так ?
сама по себе таблица не удаляется

автор
Стоит ли нагружать парсер поиском в глубину '//' ? Может стоит жёстко путь указать?


а как это в синтаксисе будет выглядеть ?
ХМЛ типа:
<Datas>
   <Data>
       <Filed1> blablabla</Filed1>
       <Filed2> blablabla</Filed2>
   </Data>
......................
   <Data>
       <Filed1> blablabla</Filed1>
       <Filed2> blablabla</Filed2>
   </Data>

</Datas>
student-uni
Дата: 04.02.2009 11:47:18
автор
если вы генерите XML из DataTable (.Net), то могли бы прописать в ColumnMapping тип MappingType.Attribute

нет, к сожалению "вручную" из csv- Файла
DeColo®es
Дата: 04.02.2009 12:52:49
student-uni,
просто '/Datas/Data'
student-uni
Дата: 04.02.2009 12:56:32
в итоге заменил
SELECT
ParamValues.ID.value('Filed1[1]','NVARCHAR(100)') AS Filed1,
ParamValues.ID.value('Filed2[1]','NVARCHAR(100)') AS Filed2
FROM @xml.nodes('//Datas/Data') as ParamValues(ID)
на
declare @idoc int
exec sp_xml_preparedocument @idoc out, @xml
insert #inputData
select * from openxml (@idoc, '//Data') with ([field1] varchar(100) 'field1', [field2] varchar(100) 'field2')
exec sp_xml_removedocument @idoc

летает...

всем спасибо
Mnior
Дата: 04.02.2009 13:03:54
Уже не важно, но:

student-uni
CREATE TABLE #inputData
сама по себе таблица не удаляется
В обшем виде это не верно. # на то и #. Есть минимум 4 вида таблиц (абыкнавеная, ##, #, @) с неповторимыми областями видимости и жизни. Решёточки не переживут смерть сесии, не говоря о @.

student-uni
Mnior
Стоит ли нагружать парсер поиском в глубину '//' ? Может стоит жёстко путь указать?
а как это в синтаксисе будет выглядеть ?
FROM @xml.nodes('/Datas/Data') as ParamValues(ID)
или
OpenXml (@idoc, '/Datas/Data')