SSAS动态添加分区(一)
一、动态分区的好处就不说了,随着时间的推移,不可能一个度量值组都放在一个分区中,处理速度非常慢,如何动态添加分区,如何动态处理分区,成为了很多新手BI工程师一个头痛的问题,废话不多说,分享一下我的经验。
二、首先讲一下大致的流程,主要是通过SSIS进行任务的处理,本文主要是按照月进行分区,当然分区的规则大家可以根据自己的需求制定。
该包用到的所有变量
三、对上面四个步骤分别讲解一下。
1、得到所有分区:
①、主要设置如下图
②、输出的结果集应该传给变量Partitions
③、SQLStatement为:(主要依据创建分区的语句中需要的参数的值)
- SELECT 'RmyyHisDW' AS DataSoureID,--数据源
- 'RmyyMZ' AS CubeName,--分区来自哪一个cube
- 'RmyyMZ' AS CubeID,
- 'Fact Mz Visit Table' AS MeasureGroup,--指定是一个度量值组
- 'Fact Mz Visit Table' AS MeasureGroupID,
- 'Fact Mz Visit Table' + Cast(MonthInfo.YearMonth AS VARCHAR(6)) AS Partition,--分区名称=度量值组名称+年月
- 'SELECT [dbo].[fact_mz_visit_table].[patient_id],
- [dbo].[fact_mz_visit_table].[times],
- [dbo].[fact_mz_visit_table].[name],
- [dbo].[fact_mz_visit_table].[age],
- [dbo].[fact_mz_visit_table].[ampm],
- [dbo].[fact_mz_visit_table].[charge_type],
- [dbo].[fact_mz_visit_table].[clinic_type],
- [dbo].[fact_mz_visit_table].[contract_code],
- [dbo].[fact_mz_visit_table].[visit_dept],
- [dbo].[fact_mz_visit_table].[doctor_code],
- [dbo].[fact_mz_visit_table].[gh_date],
- [dbo].[fact_mz_visit_table].[gh_date_time],
- [dbo].[fact_mz_visit_table].[gh_opera],
- [dbo].[fact_mz_visit_table].[haoming_code],
- [dbo].[fact_mz_visit_table].[icd_code],
- [dbo].[fact_mz_visit_table].[icd_code1],
- [dbo].[fact_mz_visit_table].[icd_code2],
- [dbo].[fact_mz_visit_table].[icd_code3],
- [dbo].[fact_mz_visit_table].[response_type],
- [dbo].[fact_mz_visit_table].[visit_date],
- [dbo].[fact_mz_visit_table].[visit_date_time],
- [dbo].[fact_mz_visit_table].[visit_flag]
- FROM [dbo].[fact_mz_visit_table]
- WHERE visit_flag <> 9 and where_clause' AS SQL,--要进行分区的SQL
- cast(MinDateKey as varchar(8)) as MinDateKey,--最小datekey
- cast(MaxDateKey as varchar(8)) as MaxDateKey--最大datekey
- FROM (SELECT t1.YearMonth,
- (SELECT Min(datekey)
- FROM dim_date t2
- WHERE CONVERT(VARCHAR(6), t2.Date, 112) = t1.YearMonth) AS MinDateKey,
- (SELECT Max(datekey)
- FROM dim_date t2
- WHERE CONVERT(VARCHAR(6), t2.Date, 112) = t1.YearMonth) AS MaxDateKey
- FROM (SELECT DISTINCT CONVERT(VARCHAR(6), Date, 112) AS YearMonth
- FROM dim_date) AS t1) MonthInfo
- WHERE EXISTS(SELECT *
- FROM fact_mz_visit_table
- WHERE visit_date BETWEEN MonthInfo.MinDateKey AND MonthInfo.MaxDateKey)
注意:SQL字段中最后面有个where_clause ,在“判断分区脚本任务”中的C#脚本中会替换成后面的where条件,也就是将MinDateKey和MaxDateKey加入条件限制,进行分区。
④、步骤③执行的结果为
2、Foreach 循环容器(主要循环执行上面的sql语句执行的结果)相关设置如下图
注意:变量映射按照sql语句中的字段名的顺序
3、判断分区是否存在,主要是通过步骤2中传出的参数判断cube中是否有该分区,有则不创建,无则通过Anaysis Services执行DDL任务来创建。
①、具体设置如下:
②、点击编辑脚本任务
需要引用AMO
③主要代码为
- /*
- Microsoft SQL Server Integration Services Script Task
- Write scripts using Microsoft Visual C# 2008.
- The ScriptMain is the entry point class of the script.
- */
- using System;
- using System.Data;
- using Microsoft.SqlServer.Dts.Runtime;
- using System.Windows.Forms;
- using Microsoft.AnalysisServices;
- namespace ST_f33f263fa3864817a3291fc4715774d3.csproj
- {
- [System.AddIn.AddIn("ScriptMain", Version = "1.0", Publisher = "", Description = "")]
- public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
- {
- #region VSTA generated code
- enum ScriptResults
- {
- Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,
- Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
- };
- #endregion
- /*
- The execution engine calls this method when the task executes.
- To access the object model, use the Dts property. Connections, variables, events,
- and logging features are available as members of the Dts property as shown in the following examples.
- To reference a variable, call Dts.Variables["MyCaseSensitiveVariableName"].Value;
- To post a log entry, call Dts.Log("This is my log text", 999, null);
- To fire an event, call Dts.Events.FireInformation(99, "test", "hit the help message", "", 0, true);
- To use the connections collection use something like the following:
- ConnectionManager cm = Dts.Connections.Add("OLEDB");
- cm.ConnectionString = "Data Source=localhost;Initial Catalog=AdventureWorks;Provider=SQLNCLI10;Integrated Security=SSPI;Auto Translate=False;";
- Before returning from this method, set the value of Dts.TaskResult to indicate success or failure.
- To open Help, press F1.
- */
- public void Main()
- {
- // TODO: Add your code here
- // Dts.TaskResult = (int)ScriptResults.Success;
- //将参数赋给变量
- String sPartition = (String)Dts.Variables["Partition"].Value;
- String sCubeName = (String)Dts.Variables["CubeName"].Value;
- String sMeasureGroup = (String)Dts.Variables["MeasureGroup"].Value;
- String sServer = "localhost";
- String sDataBaseID = (String)Dts.Variables["DatabaseID"].Value;
- String sCubeID = (String)Dts.Variables["CubeID"].Value;
- String sMeasureGroupID = (String)Dts.Variables["MeasureGroupID"].Value;
- String sDataSoureID = (String)Dts.Variables["DataSoureID"].Value;
- String sSQL = (String)Dts.Variables["SQL"].Value;
- String sMaxDateKey = (String)Dts.Variables["MaxDateKey"].Value;
- String sMinDateKey = (String)Dts.Variables["MinDateKey"].Value;
- string aSql = sSQL.Replace("where_clause", "visit_date >=" + sMinDateKey + " and visit_date <=" + sMaxDateKey);
- ConnectionManager cm = Dts.Connections.Add("MSOLAP100");
- cm.ConnectionString = "Provider=MSOLAP.4;Data Source=localhost;Integrated Security=SSPI;Initial Catalog=" + sDataBaseID;
- Microsoft.AnalysisServices.Server aServer = new Server();
- aServer.Connect(sServer);
- Microsoft.AnalysisServices.Database aDatabase = aServer.Databases.FindByName(sDataBaseID);
- Microsoft.AnalysisServices.Cube aCube = aDatabase.Cubes.FindByName(sCubeName);
- Microsoft.AnalysisServices.MeasureGroup aMeasureGroup = aCube.MeasureGroups.FindByName(sMeasureGroup);
- //判断分区是否存在
- if (aMeasureGroup.Partitions.Contains(sPartition))
- {
- Dts.Variables["IsNetePresent"].Value = false;
- Dts.Variables["Xmla_Script"].Value = "";
- Dts.TaskResult = (int)ScriptResults.Success;
- }
- else
- {
- Dts.Variables["IsNetePresent"].Value = true;
- Dts.Variables["Xmla_Script"].Value =
- "<Create xmlns=\"http://schemas.microsoft.com/analysisservices/2003/engine\">"
- + "<ParentObject>"
- + "<DatabaseID>" + sDataBaseID + "</DatabaseID>"
- + "<CubeID>" + sCubeID + "</CubeID>"
- + "<MeasureGroupID>" + sMeasureGroupID + "</MeasureGroupID>"
- + "</ParentObject>"
- + "<ObjectDefinition>"
- + "<Partition xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" "
- +"xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:ddl2=\"http://schemas.microsoft.com/analysisservices/2003/engine/2\" xmlns:ddl2_2=\"http://schemas.microsoft.com/analysisservices/2003/engine/2/2\" xmlns:ddl100_100=\"http://schemas.microsoft.com/analysisservices/2008/engine/100/100\" xmlns:ddl200=\"http://schemas.microsoft.com/analysisservices/2010/engine/200\" xmlns:ddl200_200=\"http://schemas.microsoft.com/analysisservices/2010/engine/200/200\">"
- + "<ID>" + sPartition + "</ID>"
- + "<Name>" + sPartition + "</Name>"
- + "<Source xsi:type=\"QueryBinding\">"
- + "<DataSourceID>" + sDataSoureID + "</DataSourceID>"
- + "<QueryDefinition>" + aSql + "</QueryDefinition>"
- + "</Source>"
- + "<StorageMode>Molap</StorageMode> <ProcessingMode>Regular</ProcessingMode>"
- + "<ProactiveCaching> <SilenceInterval>-PT1S</SilenceInterval> <Latency>-PT1S</Latency> <SilenceOverrideInterval>-PT1S</SilenceOverrideInterval> <ForceRebuildInterval>-PT1S</ForceRebuildInterval>"
- + "<Source xsi:type=\"ProactiveCachingInheritedBinding\" /> </ProactiveCaching>"
- + "</Partition>"
- + "</ObjectDefinition>"
- + "</Create>";
- Dts.TaskResult = (int)ScriptResults.Success;
- }
- }
- }
- }
④、判断是否执行下一步
4、不存在创建分区(主要执行步骤3传过来的Xmla_Script),具体设置如下:
5、执行任务,查看结果:
SSAS动态添加分区(一)的更多相关文章
- SSAS动态添加分区 (转载)
一.动态分区的好处就不说了,随着时间的推移,不可能一个度量值组都放在一个分区中,处理速度非常慢,如何动态添加分区,如何动态处理分区,成为了很多新手BI工程师一个头痛的问题,废话不多说,分享一下我的经验 ...
- C#控制IIS动态添加删除网站
我的目的是在Winform程序里面,可以直接启动一个HTTP服务端,给下游客户连接使用. 查找相关技术,有两种方法: 1.使用C#动态添加网站应用到IIS中,借用IIS的管理能力来提供HTTP接口.本 ...
- js动态添加事件-事件委托
作者:白狼 出处:http://www.manks.top/javascript-dynamic-event.html 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给 ...
- 后台动态添加的button,如何触发button_click事件?
后台动态添加的button,需要在Page_Load或者Page_Init重新动态生成才能执行button_click public Panel GetContrlType() { Panel pan ...
- jquery动态添加的html,第三方插件无法生效的情况
今天一个问题纠结了半天,问题如下图 问题大致就是如上,新增的内容死活点不起,插件没有生效,在一个装逼前端群里面问,给我的答案是叫我去了解事件委托,了解一下事件冒泡!! 好吧,我一上午加半个下午的时间 ...
- 【Java EE 学习 75 下】【数据采集系统第七天】【二进制运算实现权限管理】【使用反射初始化权限表】【权限捕获拦截器动态添加权限】
一.使用反射动态添加权限 在该系统中,我使用struts2的时候非常规范,访问的Action的形式都是"ActionClassName_MethodName.action?参数列表" ...
- Hadoop学习笔记—13.分布式集群中节点的动态添加与下架
开篇:在本笔记系列的第一篇中,我们介绍了如何搭建伪分布与分布模式的Hadoop集群.现在,我们来了解一下在一个Hadoop分布式集群中,如何动态(不关机且正在运行的情况下)地添加一个Hadoop节点与 ...
- Net作业调度(五)—quartz.net动态添加job设计
介绍 在实际项目使用中quartz.net中,都希望有一个管理界面可以动态添加job,而避免每次都要上线发布. 也看到有园子的同学问过.这里就介绍下实现动态添加job的几种方式, 也是二次开发的核心模 ...
- vue中v-bind:class动态添加class
1.html代码 <template v-for='item in names'> <div id="app" class="selectItem&qu ...
随机推荐
- Markdown 完全指南
概述 Markdown 是一种用于网络文本书写的轻量级标记语言,广泛用于个人 blog.github.wiki 中.其实浏览器并不能识别 Markdown 的语法,但许多 blog.wiki 平台以及 ...
- js面向对象与原型
创建对象 var box = new Object();//创建对象 box.name = 'Lee'; //添加属性 box.age = 100; box.run = function(){ ret ...
- 重新走过HTML,那些让我amazing 的标签
这一次我用了短暂的时间重新梳理了html的标签(包括html5 新增),发现我以前忽略了很多又轻巧又精美且实用的标签,总结如下: 格式标签: <address> 标签: 定义文档或文章的作 ...
- POJ2186 Popular Cows [强连通分量|缩点]
Popular Cows Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 31241 Accepted: 12691 De ...
- CODEVS3037 线段覆盖 5[序列DP 二分]
3037 线段覆盖 5 时间限制: 3 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description 数轴上有n条线段,线段的 ...
- jquery的css详解(二)
jq的工具方法style用于设置样式,jq的实例方法css在设置样式时就是调用的它,接下来分析一下源码. jQuery.extend({ ............................ st ...
- 错误"ORA-04091: table is mutating, trigger/function may not see it"的原因以及解决办法
错误的原因该错误是在编写trigger时常遇到的问题,其根本原因是由于对本表的操作造成的.对于使用了for each row 的触发器,做了DML操作(delete,update,insert),还没 ...
- Promiscuous Mode
简介 Monitor mode 与 promiscuous mode 比较 这是在网卡上的的两个特殊的模式,简而言之,都是将网卡的过滤器关闭. Monitor mode 这是我们常常提到的snif ...
- SignalR 实现Web多人聊天室
ASP .NET SignalR 是一个ASP .NET 下的类库,可以在ASP .NET 的Web项目中实现实时通信.什么是实时通信的Web呢?就是让客户端(Web页面)和服务器端可以互相通知消 ...
- IT职场人的“存在主义”
人生在世,最重要的一条就是:找准你的位置.也就是,你的定位问题. 就在前两天,参加一次社交活动,一知名培训师回顾过往,感慨地说:一个好的培训师,一定要定位好自己的客户群,根据他们的需求做好自己的定 ...