none
XML-индекс на таблице требует 2 Гб памяти при операции DELETE, INSERT RRS feed

  • Вопрос

  • Добрый день! Имеется таблица с XML-индексом, операция DELETE над таблицей (около 10 тыс. записей) запрашивает 2 Гб памяти, становится в очередь за памятью и виснет. Не подскажете, пожалуйста, как побороть? Спасибо :)
    5 сентября 2011 г. 11:11

Ответы

  • Удаляйте порциями. Попробуйте для начала по 100 записей, потом поиграйтесь с числом чтобы достичь максимально приемлимого результата. Удалять порциями можно примерно так:

    IF EXISTS(SELECT 1 FROM <your_table> WHERE <your_condition>)
        DELETE TOP(100) <your_table> WHERE <your_condition>
    

    • Предложено в качестве ответа Dmitry Davydov 9 сентября 2011 г. 12:22
    • Помечено в качестве ответа Dmitry Davydov 14 сентября 2011 г. 12:34
    8 сентября 2011 г. 7:02
  • XML instances are stored in xml type columns as large binary objects (BLOBs). These XML instances can be large, and the stored binary representation of xml data type instances can be up to 2 GB. Without an index, these binary large objects are shredded at run time to evaluate a query. If querying XML binary large objects (BLOBs) is common in your application environment, it helps to index the xml type columns. However, there is a cost associated with maintaining the index during data modification.

    все зависит, конечно, от XML данных, которые хранятся в указанной таблице, но, так или иначе, не думаю, что эта ситуация из ряда вон выходящая. XML индексы действительно гораздо тяжелее привычных. Так что, если удаление 10 тыс. записей в таблице - это часть периодически выполняющегося бизнес-процесса, то, возможно, Вам стоить призадуматься о другой организации хранения данных. Если же это единичные потуги почистить данные, то можно попробовать сначала "убить" сам индекс, а потом разбираться с данными. Посмотрите раздел Dropping an XML Index

    Indexes on xml Data Type Columns


    Мнения, высказанные здесь, являются отражением моих личных взглядов, а не позиции корпорации Microsoft. Вся информация предоставляется "как есть" без каких-либо гарантий.
    • Изменено Dmitry Davydov 6 сентября 2011 г. 15:38
    • Предложено в качестве ответа Dmitry Davydov 9 сентября 2011 г. 12:22
    • Помечено в качестве ответа Dmitry Davydov 14 сентября 2011 г. 12:34
    6 сентября 2011 г. 15:36

Все ответы

  • XML instances are stored in xml type columns as large binary objects (BLOBs). These XML instances can be large, and the stored binary representation of xml data type instances can be up to 2 GB. Without an index, these binary large objects are shredded at run time to evaluate a query. If querying XML binary large objects (BLOBs) is common in your application environment, it helps to index the xml type columns. However, there is a cost associated with maintaining the index during data modification.

    все зависит, конечно, от XML данных, которые хранятся в указанной таблице, но, так или иначе, не думаю, что эта ситуация из ряда вон выходящая. XML индексы действительно гораздо тяжелее привычных. Так что, если удаление 10 тыс. записей в таблице - это часть периодически выполняющегося бизнес-процесса, то, возможно, Вам стоить призадуматься о другой организации хранения данных. Если же это единичные потуги почистить данные, то можно попробовать сначала "убить" сам индекс, а потом разбираться с данными. Посмотрите раздел Dropping an XML Index

    Indexes on xml Data Type Columns


    Мнения, высказанные здесь, являются отражением моих личных взглядов, а не позиции корпорации Microsoft. Вся информация предоставляется "как есть" без каких-либо гарантий.
    • Изменено Dmitry Davydov 6 сентября 2011 г. 15:38
    • Предложено в качестве ответа Dmitry Davydov 9 сентября 2011 г. 12:22
    • Помечено в качестве ответа Dmitry Davydov 14 сентября 2011 г. 12:34
    6 сентября 2011 г. 15:36
  • Удаляйте порциями. Попробуйте для начала по 100 записей, потом поиграйтесь с числом чтобы достичь максимально приемлимого результата. Удалять порциями можно примерно так:

    IF EXISTS(SELECT 1 FROM <your_table> WHERE <your_condition>)
        DELETE TOP(100) <your_table> WHERE <your_condition>
    

    • Предложено в качестве ответа Dmitry Davydov 9 сентября 2011 г. 12:22
    • Помечено в качестве ответа Dmitry Davydov 14 сентября 2011 г. 12:34
    8 сентября 2011 г. 7:02
  • Удаляйте порциями. Попробуйте для начала по 100 записей, потом поиграйтесь с числом чтобы достичь максимально приемлимого результата. Удалять порциями можно примерно так:

    IF EXISTS(SELECT 1 FROM <your_table> WHERE <your_condition>)
        DELETE TOP(100) <your_table> WHERE <your_condition>
    

    8 сентября 2011 г. 7:02