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的一篇文章描述了整个过程:
发现分区统计
冒险作品
冒险作品
网上销售
互联网销售2003
选择*
从SystemRestrictSchema($system.discover\u partition\u stat)
,数据库名称='AdventureWorksDW2008'
,CUBE_NAME='Adventure Works'
,测量组名称='互联网销售额'
,分区名称='Internet\u Sales\u 2003')
类似帖子: