Вопрос:

AMO получает разделы, где обрабатываются данные, но не индексы

c# sql-server ssas amo

47 просмотра

2 ответа

1290 Репутация автора

Я пишу сценарий, который возвращает все необработанные разделы в группе мер, используя следующую команду:

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

После проведения некоторых экспериментов, похоже, что это свойство указывает, обрабатываются ли данные, и не упоминает индексы.

После поисков по часам я не нашел никакого способа перечислить разделы, где обрабатываются данные, а индексы - нет.

Какие-либо предложения?


Я использую SQL Server 2014

Автор: Yahfoufi Источник Размещён: 06.05.2019 12:47

Ответы (2)


3 плюса

6569 Репутация автора

Решение

Во-первых, ProcessIndexes - это инкрементная операция. Так что, если вы запустите его дважды, второй раз будет довольно быстрым, потому что делать нечего. Поэтому я бы рекомендовал просто запустить его на кубе и не беспокоиться о том, запускался ли он ранее. Однако, если вам нужно проанализировать текущее состояние, тогда читайте дальше.

Лучший способ (единственный известный мне способ) определить, был ли ProcessIndexes запущен на разделе, - это изучить DISCOVER_PARTITION_STATи DISCOVER_PARTITION_DIMENSION_STATDMV, как показано ниже.

DISCOVER_PARTITION_STATДМВ возвращает одну строку для каждого агрегации с ROWCOUNT. Первая строка этого DMV имеет пустое имя агрегации и представляет количество строк данных самого низкого уровня, обработанных в этом разделе.

DISCOVER_PARTITION_DIMENSION_STATDMV может сказать вам о том , обрабатываются индексы и какой диапазон значений по каждому признаку размера находятся в этом разделе (внутренние идентификаторы, так что не очень легко интерпретировать). Мы предполагаем, что хотя бы один атрибут измерения настроен для оптимизации, поэтому он будет проиндексирован.

Вам нужно будет добавить ссылку на 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 Размещён: 08.05.2019 03:55

0 плюса

26702 Репутация автора

Я публикую этот ответ в качестве дополнительной информации @GregGalloway отличный ответ

После некоторого поиска единственный способ узнать, обрабатываются ли разделы, - это использовать DISCOVER_PARTITION_STATи DISCOVER_PARTITION_DIMENSION_STAT.

Я нашел статью, опубликованную Дареном Госсбелем, описывающую весь процесс:

В статье выше автор предоставил два метода:

  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')

Похожие посты:

Автор: Hadi Размещён: 12.06.2019 10:00
Вопросы из категории :
32x32