我正在编写一个脚本,该脚本使用以下命令返回度量值组中所有未处理的分区:
objMeasureGroup.Partitions.Cast<Partition>().Where(x => x.State != AnalysisState.Processed)
做完一些实验后,看起来该属性表明数据是否已处理且未提及索引。
搜索了几个小时之后,我没有找到任何方法来列出处理数据但未处理索引的分区。
有什么建议吗?
答案 0 :(得分:5)
我将这个答案发布为@GregGalloway最佳答案的其他信息
搜索了一段时间后,知道分区是否已处理的唯一方法是使用DISCOVER_PARTITION_STAT
和DISCOVER_PARTITION_DIMENSION_STAT
。
我发现Daren Gossbel发表了一篇描述整个过程的文章:
在上面的文章中,作者提供了两种方法:
使用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>
如果拥有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_STAT
和DISCOVER_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");
}