AMO получает разделы, где обрабатываются данные, но не индексы - PullRequest
4 голосов
/ 06 мая 2019

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

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

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

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

Есть предложения?


Окружающая среда:

  • SQL Server 2014
  • многомерный куб SSAS
  • Сценарий написан в пакете служб SSIS / Задача сценария

Ответы [ 2 ]

6 голосов
/ 08 мая 2019

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

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

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

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

Вам также потребуется добавить ссылку на 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");
}
5 голосов
/ 13 июня 2019

Я публикую этот ответ как дополнительную информацию @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')

Похожие сообщения:

...