Коллеги, помогите разобраться с таким вопросом:
Имеется xml-файл примерно такой структуры:
<?xml version="1.0" encoding="Windows-1251"?>
<PERS_LIST>
<ZGLV>
<VERSION>2.0</VERSION>
<DATA>2013-01-17</DATA>
<FILENAME>OUTDESC_XXX</FILENAME>
</ZGLV>
<PERS>
<ID_PAC>ХХХХХХ</ID_PAC>
<FAM>ПЕТРОВА</FAM>
<IM>ЛЮДМИЛА</IM>
<OT>ВАСИЛЬЕВНА</OT>
<W>2</W>
<DR>1982-01-07</DR>
<FAM_P></FAM_P>
<IM_P></IM_P>
<OT_P></OT_P>
<W_P></W_P>
<DR_P></DR_P>
<MR></MR>
<DOCTYPE>01</DOCTYPE>
<DOCSER>11 10</DOCSER>
<DOCNUM>333553</DOCNUM>
<SNILS>001-520-146 31</SNILS>
<OKATOG>10230</OKATOG>
<OKATOP></OKATOP>
<COMENTP></COMENTP>
</PERS>
</PERS_LIST>
Имеется сервер:
Microsoft SQL Server 2008 R2 (SP2) - 10.50.4000.0 (X64)
Jun 28 2012 08:36:30
Copyright (c) Microsoft Corporation
Standard Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)
На сервере имеется хранимка, которая в частности делает вот что:
declare @x as xml
Select @x=XmlData from dbo.Files where CntFile=@CntFile
insert into dbo.PERS (CntFile, ID_PAC, FAM, IM, OT, W, DR, FAM_P,
IM_P, OT_P, W_P, DR_P, MR, DOCTYPE, DOCSER, DOCNUM, SNILS, OKATOG, OKATOP, COMENTP)
select @CntFile,
n.value('(./ID_PAC)[1]', 'nvarchar(36)') ID_PAC,
n.value('(./FAM)[1]', 'nvarchar(40)') FAM,
n.value('(./IM)[1]', 'nvarchar(40)') IM,
n.value('(./OT)[1]', 'nvarchar(40)') OT,
n.value('(./W)[1]', 'int') W,
n.value('(./DR)[1]', 'datetime') DR,
Nullif(n.value('(./FAM_P)[1]', 'nvarchar(40)'),'') FAM_P,
Nullif(n.value('(./IM_P)[1]', 'nvarchar(40)'),'') IM_P,
Nullif(n.value('(./OT_P)[1]', 'nvarchar(40)'),'') OT_P,
Nullif(n.value('(./W_P)[1]', 'int'),'') W_P,
Nullif(n.value('(./DR_P)[1]', 'datetime'),'') DR_P,
Nullif(n.value('(./MR)[1]', 'nvarchar(100)'),'') MR,
Nullif(n.value('(./DOCTYPE)[1]', 'nvarchar(2)'),'') DOCTYPE,
Nullif(n.value('(./DOCSER)[1]', 'nvarchar(10)'),'') DOCSER,
Nullif(n.value('(./DOCNUM)[1]', 'nvarchar(20)'),'') DOCNUM,
Nullif(n.value('(./SNILS)[1]', 'nvarchar(14)'),'') SNILS,
n.value('(./OKATOG)[1]', 'nvarchar(11)') OKATOG,
Nullif(n.value('(./OKATOP)[1]', 'nvarchar(11)'),'') OKATOP,
Nullif(n.value('(./COMENTZ)[1]', 'nvarchar(250)'),'') COMENTZ
from @x.nodes('PERS_LIST/PERS') t(n)
xml-файлик - довольно большой, около 50 мб, порядка 20 000 записей, хранится в соответствующем xml поле другой таблицы. По этому полю даже есть xml индекс.
Собственно запрос, без insert into dbo.PERS, отрабатывает за 10-15 секунд. А вот в таком виде - вешается неопределенно (больше 7 минут ждать - терпение вышло), грузит полностью одно ядро из 8 возможных. В профайлере - ни локов, ни ошибок. Только невнятное "Сканирование начато", и тишина.
Но! Когда у БД указал уровень совместимости - 2005 (90) - хранимка отработала "мгновенно", секунд за 15.
Уровень совместимости пришло в голову указать, т.к. имеется аналогичная база на том же сервере, с данными, в которой всё работает.
Та, в которой твориться безобразие, создана из ее частичного скрипта.
Как такое может быть вообще?
На целевой таблице индексов, кроме кластерного по автоинкрементному полю - нет. Есть внешний ключ On Delete и всё.
Это бред или баг?
... и чей :)