SSAS parallel transactional incremental partitions processing

добавлено: 10 июл 11
понравилось:0
просмотров: 2197
комментов: 3

теги:

Автор: Ray D

Dealing with huge amounts of data and SSAS? Have you ever tried parallel transactional incremental partitions processing? Odd enough but in this typical (at least to me and my team) scenario AMO generates invalid XMLA-script (because in this case all <Bindings> tags must be outside of the <Process> tag). As a result, you will get an exception.
However, it is easy to fix – let’s move all <Bindings> out of the <Process> command (I know, this code is far from perfect, feel free to refactor):
static string FixXMLAForParallel(string log, string SSASDatabaseName, string SSASDatabaseId, string DWHConnString)
        {
            string bindings = "<Bindings>";

            while (log.Contains("<Bindings>"))
            {
                int bindingsOpen = log.IndexOf("<Bindings>");
                int bindingsClose = log.IndexOf("</Bindings>");

                int bindOpen = log.IndexOf("<Binding>", bindingsOpen + "<Bindings>".Length);
                int bindClose = log.IndexOf("</Binding>");

                bindings += log.Substring(bindOpen, bindClose - bindOpen + "</Bindings>".Length);

                log = log.Remove(bindingsOpen, bindingsClose - bindingsOpen + "<Bindings>".Length + 1);
            }

            bindings += "</Bindings>";
            bindings += (@"<DataSource xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xsi:type=""RelationalDataSource"">" +
                "<ID>" + SSASDatabaseId + "</ID>" +
                "<Name>" + SSASDatabaseName + "</Name>" +
                "<ConnectionString>" + DWHConnString + "</ConnectionString>" +
                "<ConnectionStringSecurity>Unchanged</ConnectionStringSecurity>" +
                "</DataSource>");

            log = log.Insert(log.IndexOf("</Parallel>") + "</Parallel>".Length, bindings);
            return log;
        }

And a usage example:
srv.CaptureXml = true;
ProcessDCPartitions(...);
srv.CaptureXml = false;
log = srv.ConcatenateCaptureLog(true, true);
results = srv.Execute(FixXMLAForParallel(log));
CheckProcessingError(results);
srv.CaptureLog.Clear();

        private void CheckProcessingError(XmlaResultCollection results)
        {
            string error = "";

            foreach (XmlaResult result in results)
            {
                foreach (XmlaMessage message in result.Messages)
                {
                    if (message is XmlaError)
                    {
                        error = error + message.Description + "\n";
                    }
                }
            }

            if (!string.IsNullOrEmpty(error))
            {
                throw new Exception(error);
            }

        }
scherbinin.blog.ru

Комментарии


  • Все нижесказанное имхо, на правах мелкой придирки ))

    Не понравился метод решения (к самому решению никаких возражений нет). С точки зрения разработчика это правильно, но с точки зрения ПМа-архитектора достаточно спорно.
    Я бы не рекомендовал применять для SSAS-задач языки, без которых вполне реально обойтись. Так как 3-4-5-15 таких вставок, и в требованиях к вакансии появляется знание С#. Стоимость поддержки проекта растет. Сложность системы также растет.

    То же самое правильнее было бы реализовать на sql.

  • Привет,

    Частично согласен, однако глубокое знание C# для этого не требуется. А как ты хочешь кастомный процессинг на sql реализовать? Можем перенести вопрос в OLAP&DWH.

  • День добрый, лучше тут или там, все равно)

    Можно так:
    в sql-процедуре формируем код xmla на основе основе шаблона(полученного например с помощью create script и возможно доработанного), там(в процедуре replace`ом) меняем id секции и другие нужные параметры, затем передаем полученный xmla
    в job-step
    или
    SSIS, Analysis Services Execute DDL Task, источник команды xmla в переменной
    или
    ascmd.exe

    Если нужно постоянно параллельно обрабатывать 2 секции, то делаем 2 Analysis Services Execute DDL Task в пакете, и передаем туда 2 переменных (xmla)



Необходимо войти на сайт, чтобы оставлять комментарии