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

C# AMO获取处理数据但不处理索引的分区,c#,sql-server,ssis,ssas,olap,C#,Sql Server,Ssis,Ssas,Olap,我正在编写一个脚本,使用以下命令返回度量值组中所有未处理的分区: objMeasureGroup.Partitions.Cast<Partition>().Where(x => x.State != AnalysisState.Processed) objMeasureGroup.Partitions.Cast()。其中(x=>x.State!=AnalysisState.Processed) 在做了一些实验之后,这个属性似乎表明数据是否经过了处理,并且没有提到索引 在搜索

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

objMeasureGroup.Partitions.Cast<Partition>().Where(x => x.State != AnalysisState.Processed)
objMeasureGroup.Partitions.Cast()。其中(x=>x.State!=AnalysisState.Processed)
在做了一些实验之后,这个属性似乎表明数据是否经过了处理,并且没有提到索引

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

有什么建议吗


环境:

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

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

区分ProcessIndex是否已在分区上运行的最佳方法(我所知的唯一方法)是研究
DISCOVER\u partition\u STAT
DISCOVER\u partition\u DIMENSION\u STAT
DMV,如下所示

DISCOVER\u PARTITION\u STAT
DMV在每个聚合中返回一行,其中包含行数。该DMV的第一行具有空白聚合名称,并表示该分区中处理的最低级别数据的行数

DISCOVER\u PARTITION\u DIMENSION\u 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");
}
我将此答案作为@Greggallowy优秀答案的附加信息发布

搜索一段时间后,知道分区是否已处理的唯一方法是使用
发现分区统计
发现分区统计

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

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

  • 使用XMLA
  • 一种方法是通过对discover_PARTITION_STAT行集的XMLA discover调用来找到结果,但它返回的结果是一大块XML,不像表格结果集那么容易读取

    范例

    
    发现分区统计
    冒险作品
    冒险作品
    网上销售
    互联网销售2003
    
  • 使用DMV查询
  • 如果您有SSAS2008,您可以使用新的DMV功能查询同一行集并返回表格结果

    范例

    选择*
    从SystemRestrictSchema($system.discover\u partition\u stat)
    ,数据库名称='AdventureWorksDW2008'
    ,CUBE_NAME='Adventure Works'
    ,测量组名称='互联网销售额'
    ,分区名称='Internet\u Sales\u 2003')
    

    类似帖子:


    非常有用的信息。但奇怪的是,为什么立方体对象没有IsIndexesProcessed属性。我已经发布了一个单独的答案来添加更多信息,请查看