SQL Server 2008 - почему производительность растет с индексом xml? - PullRequest
4 голосов
/ 09 ноября 2010

Это безумие, но производительность запросов примерно на 50% УЖЕ после того, как я добавляю первичный индекс XML в свое поле xml.

Вот что я делаю.

  • У меня есть таблица, содержащая поле XML ActivityStepLog (содержит LogData, XML)

  • Я создаю пример данных для вставки в эту таблицу, выполнив следующую команду:

    INSERT INTO dbo.ActivityStepLog (
    LogGUID
    , LogContextID
    , LogTypeID
    , LogSourceName
    , LogContent
    , LogDate
    , CreateDate
    , CreatedBy
    )
    выбрать
    LogGUID = newid ()
    , LogContextID = newid ()
    , LogTypeID = 2
    , LogSourceName = 'тестовый тестовый тест'
    , LogContent = (ВЫБЕРИТЕ верхнюю 1 * FROM ## SampleDataSampleData1, где DecisionLogID = SampleData.DecisionLogID для XML AUTO, ELEMENTS, ROOT ('BusinessRule'))
    , LogDate = current_timestamp
    , CreateDate = current_timestamp
    , CreatedBy = 'тест, созданный с помощью
    из ##SampleData SampleData

СэмУ pleData 100 000 строк, я запускаю его в цикле 5 раз, поэтому получаю 500 000 строк.

  • Поле LogContent в конечном итоге будет содержать такие данные, как:

    -2147483643 0569281A-D1A3-49E3-9E68-BCAC62E2C1C3 1016 2 0 -2147483495 1 2009-05-18T11: 47: 00 нет

(извините, не уверен, будет ли это отформатированоправильно - это просто небольшой набор элементов).

А потом я просто запускаю очень простой sql -

SELECT *
FROM ActivityStepLog
WHERE LogContent.value('(/BusinessRuleDecisionLog/SampleData1/DecisionLogID)[1]', 'int') = -2147483535

Перед созданием первичного XML-индекса в LogContent требуется 8 секундпосле, это занимает около 12 секунд.Я очистил кеш и т. Д. (DROPCLEANBUFFERS и FREEPROCCACHE), похоже, он не влияет на пропорции, хотя и влияет на общее время.

Вот моя статистика:

С индексом xmlТаблица «xml_index_nodes_325576198_256000».Число сканирований 1000000, логическое чтение 3517272, физическое чтение 0, чтение с опережением 0, логическое чтение с бита 0, физическое чтение с бита 0, чтение с опережением чтения 0. Таблица «ActivityStepLog».Сканирование 1, логическое чтение 71694, физическое чтение 0, чтение с опережением 0, чтение логического объекта 0, чтение с физического объекта 0, чтение с чтения 0 0.

С индексом OUT xml

(Затронуто 5 строк) Таблица «ActivityStepLog».Сканирование 1, логическое чтение 71694, физическое чтение 0, чтение с опережением 0, чтение логического объекта 0, чтение с физического объекта 0, чтение с опережением 0.

Таким образом, логические операции чтения намного меньше при использовании OUTXML-индекс.Я попытался добавить ВСЕ доступные вторичные индексы, которые не улучшили производительность по сравнению с наличием основного XML-индекса.

Я проведу еще несколько исследований по этому вопросу, но я был бы очень признателен за любые указатели или комментарии.

спасибо, Сильвия

1 Ответ

5 голосов
/ 30 ноября 2010

Проведя дополнительные исследования по этому вопросу - похоже, что для полей UNTYPED xml, по крайней мере в моем тестовом примере, индексы xml снижают производительность.Это похоже на типизированный xml, хотя я не особо разбирался в этом.

Одна вещь, которая DID значительно повысила производительность (спасибо за идею wBob на форуме msdn sql xml!) Быласоздать полнотекстовый индекс в поле xml.Я получил второсортное представление в тот момент.Я также включил xml-фильтр для обеспечения точности.

SELECT *
FROM dbo.ActivityStepLog
WHERE 
   CONTAINS (LogContent, '-2147483535')
   and LogContent.value('(/BusinessRuleDecisionLog/SampleData1/DecisionLogID)[1]', 'int') = -2147483535

Мне, конечно, нужно выяснить, подходит ли это всем моим потребностям в фильтрации, но пока все выглядит хорошо.

Sylvia

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...