Параметр SQL Server 2005 Xml, вызывающий тайм-аут?

Я пытаюсь отправить XML размером примерно 1 МБ в качестве параметра XML в хранимой процедуре, но соединение всегда возвращает тайм-аут.

Кто-нибудь знает, каков предел размера для типа XML?


Окружающая среда:

  • Microsoft SQL Server 2005 экспресс
  • .NET Framework 2.0
  • C#

Код С#:

using (SqlCommand commandSave = new SqlCommand("SaveScanning", this.DatabaseConnection))
{
    commandSave.CommandType = System.Data.CommandType.StoredProcedure;

    SqlParameter scanningData = new SqlParameter("ScanningData", System.Data.SqlDbType.Xml);
    scanningData.Value = new SqlXml(new XmlTextReader(**HEREISTHEXMLSTRING**, XmlNodeType.Document, null));
    commandSave.Parameters.Add(scanningData);

    commandSave.ExecuteNonQuery();
}

SQL-код:

CREATE PROCEDURE [dbo].[SaveScanning]
(
    @ScanningData XML
)
AS
BEGIN
    .
    .
    .

person Zanoni    schedule 16.06.2009    source источник
comment
Когда передается более низкий XML-контент, он работает нормально. (100кб)   -  person Zanoni    schedule 16.06.2009
comment
ограничение размера составляет 2 ГБ двоичного xml, что обычно более компактно, чем текстовое представление xml (например, qnames токенизированы в двоичном xml)   -  person ahains    schedule 16.06.2009
comment
Я предполагаю, что проблема в SQL Server. Когда я пытаюсь отправить большой XML и пытаюсь ВСТАВИТЬ данные в ТАБЛИЦУ из предложения SELECT, возникает проблема. Когда используется только SELECT из XML, проблема не возникает.   -  person Zanoni    schedule 16.06.2009


Ответы (3)


2 ГБ — это максимальный размер для типа данных XML. Я выполнил XML-параметры с текстом объемом 20 МБ, в результате чего было вставлено 1000 строк, и для этого требуется четырехъядерный процессор Xeon, в среднем 500 пользовательских spid с пулом соединений, который занимает около 25% процессора, с 16 ГБ оперативной памяти около 10 секунд.

Редактировать:

Какой метод XML вы используете с вашим SQL Select, у которого возникла проблема?

XQuery? XPath? Открытый XML?

Если бы вы могли предоставить больше своего T-SQL, это помогло бы.

person DBAndrew    schedule 16.06.2009
comment
Вот в чем проблема... Я пытаюсь вставить 5000 записей из Select в XML... Более 1000 записей, и SQL Server возвращает тайм-аут... - person Zanoni; 17.06.2009
comment
5000 записей - это какой размер в XML-тексте? 1000 записей, о которых я упоминал ранее, помещались в таблицу примерно с 50 столбцами, состоящими из большого количества varchar(50). Если ваши 5000 записей имеют ширину всего 5 столбцов, это ничего. Когда я тестировал свой первоначальный импорт XML, я помню, как тестировал до 20 000 записей, которые составляли более 400 МБ текста xml, и IIRC заняло около 2,5-3 минут. - person DBAndrew; 17.06.2009

Тайм-аут означает, что запрос выполняется слишком долго, а не слишком большой параметр.

Конечно, ваш запрос может выполняться слишком долго, потому что параметр слишком велик. Попробуйте тот же запрос с тем же параметром в SQL Server Management Studio (скачайте версию для Express).

person John Saunders    schedule 16.06.2009
comment
Я пробовал в SQL Server Management Studio, и процесс выполнялся всего за 2 секунды... - person Zanoni; 16.06.2009

Наконец я нашел решение:

«Функция» OPENXML для чтения XML пока что является лучшим способом.

CREATE PROCEDURE InsertXMLData
(
    @XMLDoc XML
)
AS

Более быстрый способ:

DECLARE @handle INT

EXEC sp_xml_preparedocument @handle OUTPUT, @XMLDoc

INSERT INTO TestTable
SELECT * FROM OPENXML (@handle, '/authors', 2) WITH 
  (au_id INT,
   au_lname VARCHAR(20),
   au_fname VARCHAR(20)
  )
EXEC sp_xml_removedocument @handle

Очень медленный способ:

INSERT INTO TestTable
SELECT
    x.item.value('@au_id', 'INT') AS au_id,
    x.item.value('@au_lname', 'VARCHAR(20)') AS au_lname
    x.item.value('@au_fname', 'VARCHAR(20)') AS au_fname
FROM
    @XMLDoc.nodes('/authors') x(item)
person Zanoni    schedule 19.06.2009