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_STAT
和 DISCOVER_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_STAT
和DISCOVER_PARTITION_DIMENSION_STAT
。
我找到了一篇 Daren Gossbel 发表的描述整个过程的文章:
作者在上面的文章中提供了两种方法:
- 使用 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>
- 使用 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')
类似帖子:
我正在编写一个脚本,使用以下命令 return 度量值组中所有未处理的分区:
objMeasureGroup.Partitions.Cast<Partition>().Where(x => x.State != AnalysisState.Processed)
经过一些实验,看起来像这样属性表示数据是否被处理并且没有提到索引。
搜索了几个小时后,我没有找到任何方法来列出处理数据但不处理索引的分区。
有什么建议吗?
环境:
- SQL 服务器 2014
- SSAS 多维立方体
- 脚本是在 SSIS 包/脚本任务中编写的
首先,ProcessIndexes是一个增量操作。因此,如果您 运行 第二次执行两次将会非常快,因为无事可做。所以我建议只 运行 将它放在多维数据集上,而不用担心它以前是否 运行。但是,如果您确实需要分析当前状态,请继续阅读。
区分 ProcessIndexes 是否已在分区上 运行 的最佳方法(我所知道的唯一方法)是研究 DISCOVER_PARTITION_STAT
和 DISCOVER_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_STAT
和DISCOVER_PARTITION_DIMENSION_STAT
。
我找到了一篇 Daren Gossbel 发表的描述整个过程的文章:
作者在上面的文章中提供了两种方法:
- 使用 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>
- 使用 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')
类似帖子: