Я создал процедуру в SQL, которая взяла большой набор данных и вывела большой XML-файл. Из-за проблем с памятью я пытаюсь настроить его так, чтобы он работал для меньших подмножеств, которые я складываю вместе в другом месте. Я добавил именованный подзапрос 'current', который фильтрует данные до одного объекта IID, а затем запускает тот же код, но по какой-то причине это занимает намного больше времени, чем я ожидал.
WITH
current AS (SELECT * FROM xml.MainDataset WHERE IID = '27'),
sources AS (SELECT DISTINCT stage, IID, name FROM current ),
pop AS (SELECT DISTINCT stage, IID, pop, type, plat FROM current ),
Singles AS (SELECT DISTINCT stage, IID, pop, type, plat, stype, split1, split2 FROM current Where split2 = 'N/A'),
Measures AS (SELECT DISTINCT stage, IID, pop, type, plat, stype, split1, split2, mType FROM current)
--SELECT stage,
SELECT IID as ukprn, name,
(SELECT pop as pop_category, type, plat,
-- SINGLES
(SELECT stype as sCat, split1 as attribute,
(SELECT mType,
(SELECT DISTINCT mDetail, stream1, stream2, stream3, stream4, stream5,
FROM current as da
WHERE da.stage = mT.stage
AND da.IID = mT.IID
AND da.pop = mT.pop
AND da.type = mT.type
AND da.plat = mT.plat
AND da.stype = mT.stype
AND da.split1 = mT.split1
AND da.split2 = mT.split2
AND da.mType = mT.mType
FOR XML PATH ('data'), TYPE) [*]
FROM Measures as mT
WHERE mT.stage = sST.stage
AND mT.IID = sST.IID
AND mT.pop = sST.pop
AND mT.type = sST.type
AND mT.plat = sST.plat
AND mT.stype = sST.stype
AND mT.split1 = sST.split1
--AND mT.split2 = sST.split2
AND mT.split2 = 'N/A'
FOR XML PATH ('measures'), TYPE) [*]
FROM Singles as sST
WHERE sST.stage = Po.stage
AND sST.IID = Po.IID
AND sST.pop = Po.pop
AND sST.type = Po.type
AND sST.plat = Po.plat
FOR XML PATH ('singles'), TYPE) [*],
FROM pop as Po
WHERE Po.stage = Pr.stage
AND Po.IID = '27'
FOR XML PATH ('pop'), TYPE) [*]
FROM Sources as Pr
WHERE Pr.stage = 'Primary'
FOR XML PATH ('source'),
root('ReleaseData')
Набор данных (xml.MainDataset) очень большой и содержит сотни уникальных значений IID, однако, если я разбью запрос на две части, они будут очень быстрыми: фильтрация основного набора данных до одного IID занимает секунду. Выполнение запроса к набору данных, который содержит только один IID, занимает всего секунду.
Что здесь происходит? Является ли «текущий» набор данных, который создается несколько раз?