AMO 获取处理数据但不处理索引的分区

AMO get partitions where data are processed but not indexes

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

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

经过一些实验,看起来像这样属性表示数据是否被处理并且没有提到索引。

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

有什么建议吗?


环境:

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

首先,ProcessIndexes是一个增量操作。因此,如果您 运行 第二次执行两次将会非常快,因为无事可做。所以我建议只 运行 将它放在多维数据集上,而不用担心它以前是否 运行。但是,如果您确实需要分析当前状态,请继续阅读。

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

DISCOVER_PARTITION_STAT DMV returns 每个聚合一行与行计数。该 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");
}

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

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

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

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

  1. 使用 XMLA

One way in which you can find it out with an XMLA discover call to the DISCOVER_PARTITION_STAT rowset, but that returns the results in big lump of XML which is not as easy to read as a tabular result set.

例子

<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 查询

If you have SSAS 2008, you can use the new DMV feature to query this same rowset and return a tabular result.

例子

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')

类似帖子: