热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

处理多维数据集的有效方法

如何解决《处理多维数据集的有效方法》经验,为你挑选了1个好方法。

我正在使用SSAS构建多维多维数据集,我根据日期列创建了分区,并为每天定义了一个分区。源数据大小大于2 TB。

在部署和处理多维数据集时,如果发生错误,则不会保存所有已处理分区,并且它们的状态仍未处理。

搜索了一段时间后,我发现以下文章提到了这一点:

并行(处理选项):用于批处理。此设置导致Analysis Services派生处理任务以在单个事务中并行运行。如果发生故障,则结果是所有更改都将回滚。

搜索之后,我发现了一种替代方法,可以从SSIS包中一步一步处理分区,如以下文章中所述:

使用AMO创建SQL Server Analysis Services分区

但是处理时间增加了400%以上。有没有一种有效的方法可以并行处理分区,而不会在发生错误时丢失所有进度?



1> Hadi..:

如果需要从并行处理选项中受益,则不能强制停止所有已处理分区的回滚。

解决类似问题的首选方法之一是分批处理分区。无需一次处理所有分区,而是可以自动并行处理每个n个分区。(经过许多经验,我发现在我的机器上将MaxParallel选项配置为10是最佳解决方案)。

然后,如果发生错误,将仅回滚当前批次。

在这个答案中,我将尝试提供逐步指南,以使用SSIS自动化批量处理分区。

套餐概述

    一批建筑尺寸

    获取未处理的分区数

    循环分区(每个循环读取10个分区)

    处理数据

    工艺指标

套餐详情

创建变量

首先,我们必须添加一些在过程中需要的变量:

intCount,intCurrent:在forloop容器中使用

p_Cube:多维数据集对象ID

p_Database:分析数据库ID

p_MaxParallel:一批中要处理的分区数

p_MeasureGroup:测量组对象标识

p_ServerName:分析服务实例名称 \

strProcessData,strProcessDimensions和strProcessIndexes:用于存储与处理数据,索引和维相关的XMLA查询

名称开头的所有变量p_都是必需的,可以将其添加为参数。

为Analysis Services添加连接管理器

添加变量后,我们必须创建一个连接管理器以连接到SQL Server Analysis Service实例:

    首先,我们必须手动配置连接管理器:

    然后,我们必须分配服务器名称和初始目录表达式,如下图所示:

    将连接管理器重命名为ssas

加工尺寸

首先,添加序列容器以隔离包中的维处理,然后添加脚本任务和Analysis Services处理任务:

打开脚本任务和选择p_Databasep_MaxParallel为只读变量,并strProcessDimensions为读写变量:

现在,打开脚本编辑器并使用以下代码:

该代码是准备XMLA命令以处理维的方法,此XMLA查询将在Analysis Services处理任务中使用

#region Namespaces
using System;
using System.Data;
using System.Data.SqlClient;
using Microsoft.SqlServer.Dts.Runtime;
using System.Linq;
using System.Windows.Forms;
using Microsoft.AnalysisServices;
#endregion

namespace ST_00ad89f595124fa7bee9beb04b6ad3d9
{

    [Microsoft.SqlServer.Dts.Tasks.ScriptTask.SSISScriptTaskEntryPointAttribute]
    public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
    {

        public void Main()
        {
            Server myServer = new Server();

            string COnnStr= Dts.Connections["ssas"].ConnectionString;
            myServer.Connect(ConnStr);

            Database db = myServer.Databases.GetByName(Dts.Variables["p_Database"].Value.ToString());

            int maxparallel = (int)Dts.Variables["p_MaxParallel"].Value;

            var dimensiOns= db.Dimensions; 

            string strData;

            strData = " \r\n  \r\n";

            foreach (Dimension dim in dimensions)
            {
             strData +=
             "     \r\n" +
             "      \r\n" +
             "     ProcessFull \r\n" +
             "     UseExisting \r\n" +
             "     \r\n";
            }

            //}

            strData += "  \r\n";

            Dts.Variables["strProcessDimensions"].Value = strData;
            Dts.TaskResult = (int)ScriptResults.Success;
        }

        #region ScriptResults declaration

        enum ScriptResults
        {
            Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,
            Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
        };
        #endregion

    }
}

现在,打开Analysis Services处理任务并手动定义任何任务,然后转到表达式并将strProcessDimensions变量分配给ProcessingCommands属性:

获取未处理的分区数

为了遍历块中的分区,我们首先要获得未处理的分区数。为此,您必须添加一个脚本任务。选择p_Cubep_Databasep_MeasureGroupp_ServerName变量为只读变量和intCount作为读写变量。

在脚本编辑器中,编写以下脚本:

#region Namespaces
using System;
using System.Data;
using Microsoft.SqlServer.Dts.Runtime;
using System.Windows.Forms;
using Microsoft.AnalysisServices;
using System.Linq;
#endregion

namespace ST_e3da217e491640eca297900d57f46a85
{

    [Microsoft.SqlServer.Dts.Tasks.ScriptTask.SSISScriptTaskEntryPointAttribute]
    public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
    {

        public void Main()
        {
            // TODO: Add your code here
            Server myServer = new Server();

            string COnnStr= Dts.Connections["ssas"].ConnectionString;
            myServer.Connect(ConnStr);

            Database db  = myServer.Databases.GetByName(Dts.Variables["p_Database"].Value.ToString());
            Cube objCube = db.Cubes.FindByName(Dts.Variables["p_Cube"].Value.ToString());
            MeasureGroup objMeasureGroup = objCube.MeasureGroups[Dts.Variables["p_MeasureGroup"].Value.ToString()];

            Dts.Variables["intCount"].Value = objMeasureGroup.Partitions.Cast().Where(x => x.State != AnalysisState.Processed).Count();

            Dts.TaskResult = (int)ScriptResults.Success;
        }

        #region ScriptResults declaration

        enum ScriptResults
        {
            Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,
            Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
        };
        #endregion

    }
}

分块处理分区

最后一步是创建一个Forloop容器并对其进行配置,如下图所示:

InitExpression:@intCurrent = 0

EvalExpression:@intCurrent <@intCount

AssignExpression = @intCurrent + @p_MaxParallel

在For Loop容器内,添加一个脚本任务以准备XMLA查询,并添加两个Analysis Services处理任务,如下图所示:

在脚本任务,选择p_Cubep_Databasep_MaxParallelp_MeasureGroup为只读变量,并选择strProcessDatastrProcessIndexes如读写变量。

在脚本编辑器中,编写以下脚本:

脚本是准备分别处理分区数据和索引所需的XMLA命令

#region Namespaces
using System;
using System.Data;
using System.Data.SqlClient;
using Microsoft.SqlServer.Dts.Runtime;
using System.Linq;
using System.Windows.Forms;
using Microsoft.AnalysisServices;
#endregion

namespace ST_00ad89f595124fa7bee9beb04b6ad3d9
{

    [Microsoft.SqlServer.Dts.Tasks.ScriptTask.SSISScriptTaskEntryPointAttribute]
    public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
    {


        public void Main()
        {
            Server myServer = new Server();

            string COnnStr= Dts.Connections["ssas"].ConnectionString;
            myServer.Connect(ConnStr);

            Database db = myServer.Databases.GetByName(Dts.Variables["p_Database"].Value.ToString());
            Cube objCube = db.Cubes.FindByName(Dts.Variables["p_Cube"].Value.ToString());
            MeasureGroup objMeasureGroup = objCube.MeasureGroups[Dts.Variables["p_MeasureGroup"].Value.ToString()];
            int maxparallel = (int)Dts.Variables["p_MaxParallel"].Value;


            int intcount = objMeasureGroup.Partitions.Cast().Where(x => x.State != AnalysisState.Processed).Count();

            if (intcount > maxparallel)
            {
                intcount = maxparallel;
            }

            var partitiOns= objMeasureGroup.Partitions.Cast().Where(x => x.State != AnalysisState.Processed).OrderBy(y => y.Name).Take(intcount);

            string strData, strIndexes;

            strData = " \r\n  \r\n";
            strIndexes = " \r\n  \r\n";

            string SQLCOnnStr= Dts.Variables["User::p_DatabaseConnection"].Value.ToString();



            foreach (Partition prt in partitions)
            {


                strData +=
                 "     \r\n " +
                 "       \r\n " +
                 "      ProcessData \r\n " +
                 "      UseExisting \r\n " +
                 "     \r\n";

                strIndexes +=
                "     \r\n " +
                "       \r\n " +
                "      ProcessIndexes \r\n " +
                "      UseExisting \r\n " +
                "     \r\n";



            }

            strData += "  \r\n";
            strIndexes += "  \r\n";

            Dts.Variables["strProcessData"].Value = strData;
            Dts.Variables["strProcessIndexes"].Value = strIndexes;

            Dts.TaskResult = (int)ScriptResults.Success;
        }

        #region ScriptResults declaration

        enum ScriptResults
        {
            Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,
            Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
        };
        #endregion

    }
}

现在,打开两个Analysis Services处理任务并手动定义任何任务(仅用于验证任务)。然后转到expression并将strProcessData变量分配给ProcessingCommandsFirst Task中的属性,并将strProcessIndexes变量分配给ProcessingCommands

现在,您可以执行该程序包,如果发生错误,则仅当前批次将回滚(10个分区)。

可能的改善

您可以添加一些日志记录任务来跟踪软件包的进度,尤其是在处理大量分区时。


由于它包含有用的详细信息,因此我在个人博客上发布了此答案:

SSAS-处理多维数据集的有效方法

我还发表了一篇有关SQLShack的更多详细信息的文章:

处理SSAS多维OLAP多维数据集的有效方法


推荐阅读
  • 本文探讨了Web开发与游戏开发之间的主要区别,旨在帮助开发者更好地理解两种开发领域的特性和需求。文章基于作者的实际经验和网络资料整理而成。 ... [详细]
  • 全能终端工具推荐:高效、免费、易用
    介绍一款备受好评的全能型终端工具——MobaXterm,它不仅功能强大,而且完全免费,适合各类用户使用。 ... [详细]
  • 如何从python读取sql[mysql基础教程]
    从python读取sql的方法:1、利用python内置的open函数读入sql文件;2、利用第三方库pymysql中的connect函数连接mysql服务器;3、利用第三方库pa ... [详细]
  • 俗话说得好,“工欲善其事,必先利其器”。这句话不仅强调了工具的重要性,也提醒我们在任何项目开始前,准备合适的工具至关重要。本文将介绍几款C语言编程中常用的工具,帮助初学者更好地选择适合自己学习和工作的编程环境。 ... [详细]
  • Eclipse 中 JSP 开发环境配置指南
    本文详细介绍了如何在 Eclipse 集成开发环境中配置 JSP 运行环境,包括必要的软件下载、Tomcat 服务器的配置以及常见问题的解决方法。 ... [详细]
  • 在Linux系统上构建Web服务器的详细步骤
    本文详细介绍了如何在Linux系统上搭建Web服务器的过程,包括安装Apache、PHP和MySQL等关键组件,以及遇到的一些常见问题及其解决方案。 ... [详细]
  • 本文将详细介绍如何在ThinkPHP6框架中实现多数据库的部署,包括读写分离的策略,以及如何通过负载均衡和MySQL同步技术优化数据库性能。 ... [详细]
  • PC时代的传奇人物
    回顾过去几十年,个人电脑(PC)的发展历程犹如一部英雄史诗。每一位杰出人物都在这一领域留下了不可磨灭的印记,他们的贡献不仅推动了技术的进步,也深刻影响了现代社会的发展。 ... [详细]
  • TortoiseSVN与VisualSVN Server的安装及基本操作指南
    本文详细介绍了如何安装VisualSVN Server以及TortoiseSVN客户端,并提供了基本的操作步骤,包括配置仓库、用户管理及权限设置等关键环节。 ... [详细]
  • 本文探讨如何利用Java反射技术来模拟Webwork框架中的URL解析过程。通过这一实践,读者可以更好地理解Webwork及其后续版本Struts2的工作原理,尤其是它们在MVC架构下的角色。 ... [详细]
  • PHP 中 preg_match 函数的 isU 修饰符详解
    本文详细解析 PHP 中 preg_match 函数中 isU 修饰符的具体含义及其应用场景,帮助开发者更好地理解和使用正则表达式。 ... [详细]
  • 在使用Maven进行项目构建时,由于依赖库的下载速度慢常常让人感到沮丧,这直接影响了开发效率和学习热情。幸运的是,阿里云提供了一个快速的国内镜像服务,能够显著提升Maven项目的构建速度。 ... [详细]
  • 深入分析十大PHP开发框架
    随着PHP技术的发展,各类开发框架层出不穷,成为了开发者们热议的话题。本文将详细介绍并对比十款主流的PHP开发框架,旨在帮助开发者根据自身需求选择最合适的工具。 ... [详细]
  • iTOP4412开发板QtE5.7源码编译指南
    本文详细介绍了如何在iTOP4412开发板上编译QtE5.7源码,包括所需文件的位置、编译器设置、触摸库编译以及QtE5.7的完整编译流程。 ... [详细]
  • 容器与微服务基础:快速入门指南
    探索容器和微服务的基础知识,了解如何通过先进的应用性能管理(APM)工具提升监控效能。加入AppDynamics APM的导览,掌握容器与微服务实施及监控的最佳实践。 ... [详细]
author-avatar
是你让我变得冷漠涡
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有