Как эффективно обрабатывать MAX (дату) в режиме прямого запроса?

Контекст:

  • Табличный сервер и сервер отчетов Power BI в локальной среде для SQL RDBMS и SSAS Tabular (Sql Server 2016)
  • Денормализованная таблица данных. На данный момент около 100м записей.

Вызов:

Аналитик выполняет расчеты, требующие MAX (datecol)

Это невозможно в DAX в режиме прямого запроса, поэтому я вернул это в ETL и добавил столбец MaxDate.

Это большой стол, который с каждым днем ​​становится все больше. DTA предложило индекс columnstore, и это имеет для меня смысл. Но эта рекомендация индекса была основана только на запросах SELECT. У меня также будут вставки и удаления (ежедневная партия), и за ними должны будут следовать:

UPDATE table SET MaxDate = MAX(Datecol)

Мне кажется, что это не будет хорошо работать с индексом columnstore, но я его не тестировал. Возможно, зависит от того, кластеризован он или некластеризован?

Правильно ли я говорю, что MaxDate нужно обрабатывать в ETL? Попытка выполнить в DAX в режиме DirectQuery приводит к ошибкам.

Правильно ли я сказал, что нужно проявлять осторожность с индексом columnstore? Или, может быть, это вообще не имеет смысла, потому что потребуется перестроение индекса?

Я ищу путь вперед, который имеет смысл и позволяет избежать проблем.


person Chris Harrington    schedule 31.10.2017    source источник
comment
Недавно был на конференции, где один парень выступал с докладом об индексах хранилища столбцов, вы можете попробовать написать ему в Твиттере и попросить его просмотреть ваш вопрос: twitter.com/SQLStijn   -  person Tanner    schedule 31.10.2017
comment
почему бы не обработать максимум в Tableau?   -  person scsimon    schedule 31.10.2017
comment
Каков размер дневной партии?   -  person Stijn Wynants    schedule 31.10.2017
comment
почему бы не обработать максимум в Tableau? потому что также с использованием SSAS и Power BI   -  person Chris Harrington    schedule 31.10.2017
comment
Размер ежедневного пакета - пара сотен тысяч записей.   -  person Chris Harrington    schedule 31.10.2017
comment
Возможно, вы захотите создать промежуточную таблицу, выполнить там свои вычисления, а затем отправить ее одним пакетом в хранилище столбцов, чтобы у вас не возникло проблем с блокировкой. отличный сайт для получения дополнительной информации www.nikoport.com   -  person Stijn Wynants    schedule 01.11.2017
comment
Stijn: Я просмотрел этот сайт, но до сих пор не понимаю, почему промежуточная таблица лучше, чем модификация данных, а затем переиндексация в одной таблице. Не могли бы вы уточнить?   -  person Chris Harrington    schedule 02.11.2017
comment
потому что это может вызвать блокировку внутренней структуры deltastore. О скольких записях вы говорите в полной таблице?   -  person Stijn Wynants    schedule 06.11.2017


Ответы (1)


Определите меру с помощью функции MAXA(). Я могу работать с этим, используя Tabular 2016 в режиме DirectQuery.

Max Date:=MAXA(table[datecol])

Запрос к SQL Server выглядит следующим образом:

SELECT MAX([t0].[DateCol]) AS [a0] FROM ((SELECT * FROM table)) AS [t0]

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

SELECT table.*,
       max_date= (SELECT MAX(datecol) FROM dbo.table)
  FROM dbo.table

Затем вы можете создать вычисляемый столбец, если хотите:

days_offset = DATEDIFF(table[datecol], table[max_date], DAY)

* Обратите внимание, что вы не можете завершить оператор точкой с запятой, поскольку он будет использоваться в подзапросе всякий раз, когда движок создает запросы к вашей базе данных.

Подзапрос для получения MAX(datecol) должен быть очень эффективным, если таблица имеет индекс columnstore или если столбец имеет некластеризованный индекс rowstore. Намного эффективнее, чем обновлять каждую строку в таблице каждый день новой максимальной датой.

person mendosi    schedule 09.11.2017
comment
Интересно. Но я все еще не уверен, что определение меры мне поможет. MaxDate - это первый этап. Затем у меня есть DaysOffset (DateCol - MaxDate), и пользователи собираются фильтровать DaysOffset в PowerBI. Вы хотите сказать, что я могу создать вычисляемый столбец с помощью MAXA ()? - person Chris Harrington; 10.11.2017