Есть ли более эффективный способ сделать это?(Создание XML-файлов из SQL) - PullRequest
0 голосов
/ 31 мая 2019

Я создал процедуру в 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, занимает всего секунду.

Что здесь происходит? Является ли «текущий» набор данных, который создается несколько раз?

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