【问题标题】:AMO get partitions where data are processed but not indexesAMO 获取处理数据但不处理索引的分区
【发布时间】:2019-05-06 12:47:57
【问题描述】:

我正在编写一个脚本,使用以下命令返回度量值组中所有未处理的分区:

objMeasureGroup.Partitions.Cast<Partition>().Where(x => x.State != AnalysisState.Processed)

做了一些实验后,看起来这个属性表明数据是否被处理并且没有提到索引。

搜索了几个小时后,我没有找到任何方法来列出处理数据但未处理索引的分区。

有什么建议吗?


环境:

  • SQL Server 2014
  • SSAS 多维立方体
  • 脚本是在 SSIS 包/脚本任务中编写的

【问题讨论】:

    标签: c# sql-server ssis ssas olap


    【解决方案1】:

    首先,ProcessIndexes 是一个增量操作。所以如果你第二次运行它两次会很快,因为没有什么可做的。所以我建议只在多维数据集上运行它,而不用担心它之前是否运行过。但是,如果您确实需要分析当前状态,请继续阅读。

    区分 ProcessIndexes 是否已在分区上运行的最佳方法(我知道的唯一方法)是研究 DISCOVER_PARTITION_STATDISCOVER_PARTITION_DIMENSION_STAT DMV,如下所示。

    DISCOVER_PARTITION_STAT DMV 在每个聚合中返回一行以及行数。该 DMV 的第一行有一个空白聚合名称,表示该分区中处理的最低级别数据的行数。

    DISCOVER_PARTITION_DIMENSION_STAT DMV 可以告诉您是否处理了索引以及每个维度属性的值范围在该分区中(通过内部 ID,因此不太容易解释)。我们假设至少有一个维度属性被设置为优化,以便将其编入索引。

    您还需要添加对 Microsoft.AnalysisServices.AdomdClient 的引用以简化这些 DMV 的运行:

    string sDatabaseName = "YourDatabaseName";
    string sCubeName = "YourCubeName";
    string sMeasureGroupName = "YourMeasureGroupName";
    Microsoft.AnalysisServices.Server s = new Microsoft.AnalysisServices.Server();
    s.Connect("Data Source=localhost");
    Microsoft.AnalysisServices.Database db = s.Databases.GetByName(sDatabaseName);
    Microsoft.AnalysisServices.Cube c = db.Cubes.GetByName(sCubeName);
    Microsoft.AnalysisServices.MeasureGroup mg = c.MeasureGroups.GetByName(sMeasureGroupName);
    
    Microsoft.AnalysisServices.AdomdClient.AdomdConnection conn = new Microsoft.AnalysisServices.AdomdClient.AdomdConnection(s.ConnectionString);
    conn.Open();
    
    foreach (Microsoft.AnalysisServices.Partition p in mg.Partitions)
    {
        Console.Write(p.Name + " - " + p.State + " - ");
        var restrictions = new Microsoft.AnalysisServices.AdomdClient.AdomdRestrictionCollection();
        restrictions.Add("DATABASE_NAME", db.Name);
        restrictions.Add("CUBE_NAME", c.Name);
        restrictions.Add("MEASURE_GROUP_NAME", mg.Name);
        restrictions.Add("PARTITION_NAME", p.Name);
        var dsAggs = conn.GetSchemaDataSet("DISCOVER_PARTITION_STAT", restrictions);
        var dsIndexes = conn.GetSchemaDataSet("DISCOVER_PARTITION_DIMENSION_STAT", restrictions);
        if (dsAggs.Tables[0].Rows.Count == 0)
            Console.WriteLine("ProcessData not run yet");
        else if (dsAggs.Tables[0].Rows.Count > 1)
            Console.WriteLine("aggs processed");
        else if (p.AggregationDesign == null || p.AggregationDesign.Aggregations.Count == 0)
        {
            bool bIndexesBuilt = false;
            foreach (System.Data.DataRow row in dsIndexes.Tables[0].Rows)
            {
                if (Convert.ToBoolean(row["ATTRIBUTE_INDEXED"]))
                {
                    bIndexesBuilt = true;
                    break;
                }
            }
            if (bIndexesBuilt)
                Console.WriteLine("indexes have been processed. no aggs defined");
            else
                Console.WriteLine("no aggs defined. need to run ProcessIndexes on this partition to build indexes");
        }
        else
            Console.WriteLine("need to run ProcessIndexes on this partition to process aggs and indexes");
    }
    

    【讨论】:

    • 非常有用的信息。但奇怪的是为什么 Cube 对象没有 IsIndexesProcessed 属性。
    • 我已经发布了单独的答案以添加更多信息,请查看
    【解决方案2】:

    我将此答案作为@GregGalloway 优秀答案的附加信息发布

    搜索了一段时间,知道分区是否被处理的唯一方法是使用DISCOVER_PARTITION_STATDISCOVER_PARTITION_DIMENSION_STAT

    我发现Daren Gossbel 发的一篇文章描述了整个过程:

    在上面的文章中作者提供了两种方法:

    1. 使用 XMLA

    您可以通过对 DISCOVER_PARTITION_STAT 行集的 XMLA 发现调用找到它的一种方法,但它会以大块 XML 的形式返回结果,这不像表格结果集那样易于阅读。

    例子

    <Discover xmlns="urn:schemas-microsoft-com:xml-analysis">
    
        <RequestType>DISCOVER_PARTITION_STAT</RequestType>
    
        <Restrictions>
            <RestrictionList>
          <DATABASE_NAME>Adventure Works DW</DATABASE_NAME>
          <CUBE_NAME>Adventure Works</CUBE_NAME>
          <MEASURE_GROUP_NAME>Internet Sales</MEASURE_GROUP_NAME>
          <PARTITION_NAME>Internet_Sales_2003</PARTITION_NAME>
        </RestrictionList>
        </Restrictions>
    
        <Properties>
            <PropertyList>
               </PropertyList>
        </Properties>
    
    </Discover>
    
    1. 使用 DMV 查询

    如果您有 SSAS 2008,则可以使用新的 DMV 功能来查询同一行集并返回表格结果。

    例子

    SELECT * 
    FROM SystemRestrictSchema($system.discover_partition_stat
            ,DATABASE_NAME = 'Adventure Works DW 2008'
            ,CUBE_NAME = 'Adventure Works'
            ,MEASURE_GROUP_NAME = 'Internet Sales'
            ,PARTITION_NAME = 'Internet_Sales_2003')
    

    类似帖子:

    【讨论】:

      猜你喜欢
      • 2023-03-25
      • 1970-01-01
      • 2020-03-30
      • 2014-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多