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

时间:2019-05-06 12:47:58

标签: c# ssas sql-server-2014 amo multidimensional-cube

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

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

做完一些实验后,看起来该属性表明数据是否已处理且未提及索引。

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

有什么建议吗?

2 个答案:

答案 0 :(得分:5)

我将这个答案发布为@GregGalloway最佳答案的其他信息

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

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

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

  1. 使用XMLA
  

使用XMLA对DISCOVER_PARTITION_STAT行集进行发现调用的一种方法,但是以大块的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')

类似的帖子:

答案 1 :(得分: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");
}