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

Откуда: Новосибирск
Сообщений: 1606
Здравствуйте !

Есть 2 сервера

Microsoft SQL Server 2008 (SP3) - 10.0.5500.0 (X64) 
	Sep 21 2011 22:45:45 
	Copyright (c) 1988-2008 Microsoft Corporation
	Standard Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) (VM)

Microsoft SQL Server 2012 - 11.0.2332.0 (X64) 
	Aug 22 2012 17:05:49 
	Copyright (c) Microsoft Corporation
	Standard Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) (Hypervisor)


Причем 2012 стоит на более мощном компьютере, в наследство достался код: (упрощенно:)

DECLARE
@xml XML =

'
<Пакет>
  <Объект ТипОбъекта="Документ" УникальныйИдентификатор="BNCP51" Дата="4/10/2012" Время="23:59:59" ПометкаУдаления="0" Проведен="1" ТипДокумента="Выписка" ВидДокумента="Выписка">
    <РасчетныйСчет Номер="XXX">
      <Банк НаименованиеБанка="БАНК" БИК="XXX" КоррСчет="XXX" МестонахождениеБанка="Г.ЕКАТЕРИНБУРГ" Адрес="" Телефоны="" />
    </РасчетныйСчет>
    <Строка НомерСтроки="1" ДвижениеДенежныхСредств="Поступления от покупателей" НазначениеПлатежа="Оплата по сч.Том12" КоррСчет="62.1" СуммаПрихода="60" СуммаРасхода="0" Субконто1="" Субконто2="" Субконто3="" НомерДокВходящий="239" ДатаДокВходящий="4/10/2012">
      <Контрагент Guid2="7E202FEA-700D-4CEA-82FC-1917C5BCBE6E" Наименование="XXX" ПолнНаименование="XXX" ВидКонтрагента="Организация" ИНН="XXX" ЮридическийАдрес="XXX" ПочтовыйАдрес="XXX" ДокументСерия="" ДокументНомер="" ДокументКемВыдан="" ДокументДатаВыдачи="12:00:00 AM" />
      <Счет GUID="611A854A-06BB-4477-968B-235E78235F8C" УникальныйИдентификатор="BHMBF1" />
    </Строка>
  </Объект>
</Пакет>
'

порядка 500 узлов "Строка"

select 
	T.c.value('../@НомерСтроки', 'int'),
	nullif(ltrim(rtrim(T.c.value('@GUID', 'varchar(50)'))), ''),
  nullif(ltrim(rtrim(T.c.value('@УникальныйИдентификатор', 'varchar(50)'))), ''),
	isnull(nullif(T.c.value('../@СуммаПрихода', 'money'), 0.0), T.c.value('../@СуммаРасхода', 'money')),
	T.c.value('../@НазначениеПлатежа', 'varchar(200)'),
	T.c.value('../@НомерДокВходящий', 'varchar(50)'),
	convert(datetime, T.c.value('../@ДатаДокВходящий', 'varchar(50)'), 101),
	case T.c.value('../@СуммаПрихода', 'money') when 0.0 then 'PaymentOutCashless' else 'PaymentInCashless' end, 
	T.c.value('../@КоррСчет', 'varchar(50)'),
	T.c.value('(../Контрагент)[1]/@ВидКонтрагента', 'varchar(50)'),
	nullif(ltrim(rtrim(T.c.value('(../Контрагент)[1]/@Guid2', 'varchar(50)'))), ''),
  nullif(ltrim(rtrim(T.c.value('(../Контрагент)[1]/@ПолнНаименование', 'varchar(500)'))), ''),
  nullif(ltrim(rtrim(T.c.value('(../Контрагент)[1]/@Наименование', 'varchar(500)'))), ''),
	T.c.value('(../Контрагент)[1]/@ИНН', 'varchar(50)'),
	T.c.value('(../Контрагент)[1]/@ДокументСерия', 'varchar(50)'),
	T.c.value('(../Контрагент)[1]/@ДокументНомер', 'varchar(50)'),
  T.c.value('(../Контрагент)[1]/@ДокументКемВыдан', 'varchar(100)'),
  convert(datetime, T.c.value('(../Контрагент)[1]/@ДокументДатаВыдачи', 'varchar(500)'), 101),
  T.c.value('(../Контрагент)[1]/@ЮридическийАдрес', 'varchar(500)'),
  T.c.value('(../Контрагент)[1]/@ПочтовыйАдрес', 'varchar(50)'),
  T.c.value('(../Контрагент)[1]/@Телефоны', 'varchar(100)')
from @xml.nodes('Пакет/Объект/Строка/Счет') T(c)


Данный запрос на 2008 выполняется полторы минуты, на 2012 в 3! раза дольше.
Планы "стремненькие", видимо из-за того что практически каждый столбец лезет за данными в родительский узел, НО идентичные.
В чем может быть причина падения производительности на более новом SQL сервере и более мощном компьютере ?
Вопрос скорее академический, прошу не предлагать переписать запрос, интересует именно возможные причины что одно и тоже работает с разной скоростью, а то мало ли что, мож с установкой 2012 накосячили :-)
30 окт 12, 17:34    [13398647]     Ответить | Цитировать Сообщить модератору
 Re: 2008 vs 2012. Парсинг XML  [new]
defragmentator
Member

Откуда:
Сообщений: 20504
Просто как предположение, что 2012 требует более мощных ресурсов в силу своих более продвинутых возможностей (типа добавления столбца в таблицу "на лету").
А так надо смотреть планы, ставить эксперименты.
1 ноя 12, 14:21    [13408719]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить