一、动态分区的好处就不说了,随着时间的推移,不可能一个度量值组都放在一个分区中,处理速度非常慢,如何动态添加分区,如何动态处理分区,成为了很多新手BI工程师一个头痛的问题,废话不多说,分享一下我的经验。

二、首先讲一下大致的流程,主要是通过SSIS进行任务的处理,本文主要是按照月进行分区,当然分区的规则大家可以根据自己的需求制定。

该包用到的所有变量

三、对上面四个步骤分别讲解一下。

1、得到所有分区:

①、主要设置如下图

②、输出的结果集应该传给变量Partitions

③、SQLStatement为:(主要依据创建分区的语句中需要的参数的值)

  1. SELECT 'RmyyHisDW' AS DataSoureID,--数据源
  2. 'RmyyMZ' AS CubeName,--分区来自哪一个cube
  3. 'RmyyMZ' AS CubeID,
  4. 'Fact Mz Visit Table' AS MeasureGroup,--指定是一个度量值组
  5. 'Fact Mz Visit Table' AS MeasureGroupID,
  6. 'Fact Mz Visit Table' + Cast(MonthInfo.YearMonth AS VARCHAR(6)) AS Partition,--分区名称=度量值组名称+年月
  7. 'SELECT [dbo].[fact_mz_visit_table].[patient_id],
  8. [dbo].[fact_mz_visit_table].[times],
  9. [dbo].[fact_mz_visit_table].[name],
  10. [dbo].[fact_mz_visit_table].[age],
  11. [dbo].[fact_mz_visit_table].[ampm],
  12. [dbo].[fact_mz_visit_table].[charge_type],
  13. [dbo].[fact_mz_visit_table].[clinic_type],
  14. [dbo].[fact_mz_visit_table].[contract_code],
  15. [dbo].[fact_mz_visit_table].[visit_dept],
  16. [dbo].[fact_mz_visit_table].[doctor_code],
  17. [dbo].[fact_mz_visit_table].[gh_date],
  18. [dbo].[fact_mz_visit_table].[gh_date_time],
  19. [dbo].[fact_mz_visit_table].[gh_opera],
  20. [dbo].[fact_mz_visit_table].[haoming_code],
  21. [dbo].[fact_mz_visit_table].[icd_code],
  22. [dbo].[fact_mz_visit_table].[icd_code1],
  23. [dbo].[fact_mz_visit_table].[icd_code2],
  24. [dbo].[fact_mz_visit_table].[icd_code3],
  25. [dbo].[fact_mz_visit_table].[response_type],
  26. [dbo].[fact_mz_visit_table].[visit_date],
  27. [dbo].[fact_mz_visit_table].[visit_date_time],
  28. [dbo].[fact_mz_visit_table].[visit_flag]
  29. FROM [dbo].[fact_mz_visit_table]
  30. WHERE visit_flag <> 9 and where_clause' AS SQL,--要进行分区的SQL
  31. cast(MinDateKey as varchar(8)) as MinDateKey,--最小datekey
  32. cast(MaxDateKey as varchar(8)) as MaxDateKey--最大datekey
  33. FROM (SELECT t1.YearMonth,
  34. (SELECT Min(datekey)
  35. FROM dim_date t2
  36. WHERE CONVERT(VARCHAR(6), t2.Date, 112) = t1.YearMonth) AS MinDateKey,
  37. (SELECT Max(datekey)
  38. FROM dim_date t2
  39. WHERE CONVERT(VARCHAR(6), t2.Date, 112) = t1.YearMonth) AS MaxDateKey
  40. FROM (SELECT DISTINCT CONVERT(VARCHAR(6), Date, 112) AS YearMonth
  41. FROM dim_date) AS t1) MonthInfo
  42. WHERE EXISTS(SELECT *
  43. FROM fact_mz_visit_table
  44. 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

③主要代码为

  1. /*
  2. Microsoft SQL Server Integration Services Script Task
  3. Write scripts using Microsoft Visual C# 2008.
  4. The ScriptMain is the entry point class of the script.
  5. */
  6.  
  7. using System;
  8. using System.Data;
  9. using Microsoft.SqlServer.Dts.Runtime;
  10. using System.Windows.Forms;
  11. using Microsoft.AnalysisServices;
  12.  
  13. namespace ST_f33f263fa3864817a3291fc4715774d3.csproj
  14. {
  15. [System.AddIn.AddIn("ScriptMain", Version = "1.0", Publisher = "", Description = "")]
  16. public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
  17. {
  18.  
  19. #region VSTA generated code
  20. enum ScriptResults
  21. {
  22. Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,
  23. Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
  24. };
  25. #endregion
  26.  
  27. /*
  28. The execution engine calls this method when the task executes.
  29. To access the object model, use the Dts property. Connections, variables, events,
  30. and logging features are available as members of the Dts property as shown in the following examples.
  31.  
  32. To reference a variable, call Dts.Variables["MyCaseSensitiveVariableName"].Value;
  33. To post a log entry, call Dts.Log("This is my log text", 999, null);
  34. To fire an event, call Dts.Events.FireInformation(99, "test", "hit the help message", "", 0, true);
  35.  
  36. To use the connections collection use something like the following:
  37. ConnectionManager cm = Dts.Connections.Add("OLEDB");
  38. cm.ConnectionString = "Data Source=localhost;Initial Catalog=AdventureWorks;Provider=SQLNCLI10;Integrated Security=SSPI;Auto Translate=False;";
  39.  
  40. Before returning from this method, set the value of Dts.TaskResult to indicate success or failure.
  41.  
  42. To open Help, press F1.
  43. */
  44.  
  45. public void Main()
  46. {
  47. // TODO: Add your code here
  48. // Dts.TaskResult = (int)ScriptResults.Success;
  49. //将参数赋给变量
  50. String sPartition = (String)Dts.Variables["Partition"].Value;
  51. String sCubeName = (String)Dts.Variables["CubeName"].Value;
  52. String sMeasureGroup = (String)Dts.Variables["MeasureGroup"].Value;
  53. String sServer = "localhost";
  54. String sDataBaseID = (String)Dts.Variables["DatabaseID"].Value;
  55.  
  56. String sCubeID = (String)Dts.Variables["CubeID"].Value;
  57. String sMeasureGroupID = (String)Dts.Variables["MeasureGroupID"].Value;
  58. String sDataSoureID = (String)Dts.Variables["DataSoureID"].Value;
  59. String sSQL = (String)Dts.Variables["SQL"].Value;
  60. String sMaxDateKey = (String)Dts.Variables["MaxDateKey"].Value;
  61. String sMinDateKey = (String)Dts.Variables["MinDateKey"].Value;
  62. string aSql = sSQL.Replace("where_clause", "visit_date >=" + sMinDateKey + " and visit_date <=" + sMaxDateKey);
  63.  
  64. ConnectionManager cm = Dts.Connections.Add("MSOLAP100");
  65. cm.ConnectionString = "Provider=MSOLAP.4;Data Source=localhost;Integrated Security=SSPI;Initial Catalog=" + sDataBaseID;
  66.  
  67. Microsoft.AnalysisServices.Server aServer = new Server();
  68. aServer.Connect(sServer);
  69. Microsoft.AnalysisServices.Database aDatabase = aServer.Databases.FindByName(sDataBaseID);
  70. Microsoft.AnalysisServices.Cube aCube = aDatabase.Cubes.FindByName(sCubeName);
  71. Microsoft.AnalysisServices.MeasureGroup aMeasureGroup = aCube.MeasureGroups.FindByName(sMeasureGroup);
  72. //判断分区是否存在
  73. if (aMeasureGroup.Partitions.Contains(sPartition))
  74. {
  75. Dts.Variables["IsNetePresent"].Value = false;
  76. Dts.Variables["Xmla_Script"].Value = "";
  77. Dts.TaskResult = (int)ScriptResults.Success;
  78. }
  79. else
  80. {
  81. Dts.Variables["IsNetePresent"].Value = true;
  82. Dts.Variables["Xmla_Script"].Value =
  83. "<Create xmlns=\"http://schemas.microsoft.com/analysisservices/2003/engine\">"
  84. + "<ParentObject>"
  85. + "<DatabaseID>" + sDataBaseID + "</DatabaseID>"
  86. + "<CubeID>" + sCubeID + "</CubeID>"
  87. + "<MeasureGroupID>" + sMeasureGroupID + "</MeasureGroupID>"
  88. + "</ParentObject>"
  89. + "<ObjectDefinition>"
  90. + "<Partition xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" "
  91. +"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\">"
  92. + "<ID>" + sPartition + "</ID>"
  93. + "<Name>" + sPartition + "</Name>"
  94. + "<Source xsi:type=\"QueryBinding\">"
  95. + "<DataSourceID>" + sDataSoureID + "</DataSourceID>"
  96. + "<QueryDefinition>" + aSql + "</QueryDefinition>"
  97. + "</Source>"
  98. + "<StorageMode>Molap</StorageMode> <ProcessingMode>Regular</ProcessingMode>"
  99. + "<ProactiveCaching> <SilenceInterval>-PT1S</SilenceInterval> <Latency>-PT1S</Latency> <SilenceOverrideInterval>-PT1S</SilenceOverrideInterval> <ForceRebuildInterval>-PT1S</ForceRebuildInterval>"
  100. + "<Source xsi:type=\"ProactiveCachingInheritedBinding\" /> </ProactiveCaching>"
  101. + "</Partition>"
  102. + "</ObjectDefinition>"
  103. + "</Create>";
  104. Dts.TaskResult = (int)ScriptResults.Success;
  105. }
  106. }
  107. }
  108. }

④、判断是否执行下一步

4、不存在创建分区(主要执行步骤3传过来的Xmla_Script),具体设置如下:

5、执行任务,查看结果:

SSAS动态添加分区(一)的更多相关文章

  1. SSAS动态添加分区 (转载)

    一.动态分区的好处就不说了,随着时间的推移,不可能一个度量值组都放在一个分区中,处理速度非常慢,如何动态添加分区,如何动态处理分区,成为了很多新手BI工程师一个头痛的问题,废话不多说,分享一下我的经验 ...

  2. C#控制IIS动态添加删除网站

    我的目的是在Winform程序里面,可以直接启动一个HTTP服务端,给下游客户连接使用. 查找相关技术,有两种方法: 1.使用C#动态添加网站应用到IIS中,借用IIS的管理能力来提供HTTP接口.本 ...

  3. js动态添加事件-事件委托

    作者:白狼 出处:http://www.manks.top/javascript-dynamic-event.html 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给 ...

  4. 后台动态添加的button,如何触发button_click事件?

    后台动态添加的button,需要在Page_Load或者Page_Init重新动态生成才能执行button_click public Panel GetContrlType() { Panel pan ...

  5. jquery动态添加的html,第三方插件无法生效的情况

    今天一个问题纠结了半天,问题如下图  问题大致就是如上,新增的内容死活点不起,插件没有生效,在一个装逼前端群里面问,给我的答案是叫我去了解事件委托,了解一下事件冒泡!! 好吧,我一上午加半个下午的时间 ...

  6. 【Java EE 学习 75 下】【数据采集系统第七天】【二进制运算实现权限管理】【使用反射初始化权限表】【权限捕获拦截器动态添加权限】

    一.使用反射动态添加权限 在该系统中,我使用struts2的时候非常规范,访问的Action的形式都是"ActionClassName_MethodName.action?参数列表" ...

  7. Hadoop学习笔记—13.分布式集群中节点的动态添加与下架

    开篇:在本笔记系列的第一篇中,我们介绍了如何搭建伪分布与分布模式的Hadoop集群.现在,我们来了解一下在一个Hadoop分布式集群中,如何动态(不关机且正在运行的情况下)地添加一个Hadoop节点与 ...

  8. Net作业调度(五)—quartz.net动态添加job设计

    介绍 在实际项目使用中quartz.net中,都希望有一个管理界面可以动态添加job,而避免每次都要上线发布. 也看到有园子的同学问过.这里就介绍下实现动态添加job的几种方式, 也是二次开发的核心模 ...

  9. vue中v-bind:class动态添加class

    1.html代码 <template v-for='item in names'> <div id="app" class="selectItem&qu ...

随机推荐

  1. Markdown 完全指南

    概述 Markdown 是一种用于网络文本书写的轻量级标记语言,广泛用于个人 blog.github.wiki 中.其实浏览器并不能识别 Markdown 的语法,但许多 blog.wiki 平台以及 ...

  2. js面向对象与原型

    创建对象 var box = new Object();//创建对象 box.name = 'Lee'; //添加属性 box.age = 100; box.run = function(){ ret ...

  3. 重新走过HTML,那些让我amazing 的标签

    这一次我用了短暂的时间重新梳理了html的标签(包括html5 新增),发现我以前忽略了很多又轻巧又精美且实用的标签,总结如下: 格式标签: <address> 标签: 定义文档或文章的作 ...

  4. POJ2186 Popular Cows [强连通分量|缩点]

    Popular Cows Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 31241   Accepted: 12691 De ...

  5. CODEVS3037 线段覆盖 5[序列DP 二分]

    3037 线段覆盖 5   时间限制: 3 s   空间限制: 256000 KB   题目等级 : 钻石 Diamond 题解       题目描述 Description 数轴上有n条线段,线段的 ...

  6. jquery的css详解(二)

    jq的工具方法style用于设置样式,jq的实例方法css在设置样式时就是调用的它,接下来分析一下源码. jQuery.extend({ ............................ st ...

  7. 错误"ORA-04091: table is mutating, trigger/function may not see it"的原因以及解决办法

    错误的原因该错误是在编写trigger时常遇到的问题,其根本原因是由于对本表的操作造成的.对于使用了for each row 的触发器,做了DML操作(delete,update,insert),还没 ...

  8. Promiscuous Mode

      简介 Monitor mode 与 promiscuous mode 比较 这是在网卡上的的两个特殊的模式,简而言之,都是将网卡的过滤器关闭. Monitor mode 这是我们常常提到的snif ...

  9. SignalR 实现Web多人聊天室

      ASP .NET SignalR 是一个ASP .NET 下的类库,可以在ASP .NET 的Web项目中实现实时通信.什么是实时通信的Web呢?就是让客户端(Web页面)和服务器端可以互相通知消 ...

  10. IT职场人的“存在主义”

      人生在世,最重要的一条就是:找准你的位置.也就是,你的定位问题. 就在前两天,参加一次社交活动,一知名培训师回顾过往,感慨地说:一个好的培训师,一定要定位好自己的客户群,根据他们的需求做好自己的定 ...