Академический Документы
Профессиональный Документы
Культура Документы
Power BI:
передовые методы оптимизации
Bhavik Merchant
Microsoft Power BI
Performance
Best Practices
A comprehensive guide
to building consistently fast
Power BI solutions
BIRMINGHAM—MUMBAI
Бхавик Мерчант
Power BI:
передовые
методы оптимизации
Полное руководство
по построению стабильно
быстрых решений
в Microsoft Power BI
Москва, 2023
УДК 004.424
ББК 32.372
М52
Мерчант Б.
М52 Power BI: передовые методы оптимизации / пер. с англ. А. Ю. Гинько. – М.:
ДМК Пресс, 2023. – 282 с.: ил.
ISBN 978-5-93700-168-9
Эта книга научит вас поддерживать решения Power BI любой степени слож-
ности с минимальными усилиями. Вы узнаете, как проводить оптимизацию на
всех слоях Power BI – начиная с рабочей области отчета и заканчивая модели-
рованием данных, их преобразованием, хранением и архитектурой. Выясните,
что необходимо сделать, чтобы при масштабировании проекта не страдало его
быстродействие. Научитесь определять распространенные ошибки на этапе про-
ектирования данных, приводящие к снижению эффективности решения и рас-
ходованию лишней памяти.
Издание предназначено для аналитиков данных, разработчиков в области биз-
нес-аналитики и специалистов по работе с Power BI. Оно пригодится тем, кто хочет
создавать решения на базе Power BI, способные масштабироваться в отношении
объема данных и количества пользователей без потери эффективности. Для из-
учения материала потребуется базовое знание Power BI и всех его компонентов.
УДК 004.424
ББК 32.372
First published in the English language under the title ‘Microsoft Power BI Performance Best
Practices – (9781801076449).
Все права защищены. Любая часть этой книги не может быть воспроизведена в ка-
кой бы то ни было форме и какими бы то ни было средствами без письменного разрешения
владельцев авторских прав.
От издательства. ...................................................................................................12
Предисловие...........................................................................................................13
Об авторе. ................................................................................................................14
О редакторах..........................................................................................................15
Введение. .................................................................................................................16
Отзывы и пожелания
Мы всегда рады отзывам наших читателей. Расскажите нам, что вы думаете
об этой книге – что понравилось или, может быть, не понравилось. Отзывы
важны для нас, чтобы выпускать книги, которые будут для вас максимально
полезны.
Вы можете написать отзыв на нашем сайте www.dmkpress.com, зайдя на
страницу книги и оставив комментарий в разделе «Отзывы и рецензии».
Также можно послать письмо главному редактору по адресу dmkpress@gmail.
com; при этом укажите название книги в теме письма.
Если вы являетесь экспертом в какой-либо области и заинтересованы в на-
писании новой книги, заполните форму на нашем сайте по адресу http://
dmkpress.com/authors/publish_book/ или напишите в издательство по адресу
dmkpress@gmail.com.
Список опечаток
Хотя мы приняли все возможные меры для того, чтобы обеспечить высо-
кое качество наших текстов, ошибки все равно случаются. Если вы найдете
ошибку в одной из наших книг, мы будем очень благодарны, если вы сооб-
щите о ней главному редактору по адресу dmkpress@gmail.com. Сделав это,
вы избавите других читателей от недопонимания и поможете нам улучшить
последующие издания этой книги.
Структура книги
Глава 1 «Постановка целей и определение проблемных областей». В этой
главе мы рассмотрим решение на базе Power BI в виде потока данных от
различных источников к потребителям в обобщенном виде. Мы посмотрим,
как могут храниться и перемещаться данные в Power BI на пути к конечным
потребителям. В большинстве случаев решения относительно архитектуры
проекта, принятые на ранней стадии, бывает трудно и дорого отменить или
изменить. Именно поэтому необходимо на самом старте проекта правильно
оценивать нагрузку и планировать разработку, исходя из нее.
Глава 2 «Обзор архитектуры и конфигурации Power BI». Из этой гла-
вы вы узнаете, как можно улучшить производительность и снизить время
ожидания получения информации. Здесь мы также расскажем о режимах
хранения данных в Power BI и их перемещении в модель данных, поскольку
решения, принятые на этом этапе, могут влиять на объемы и актуальность
исходных данных. Кроме того, мы рассмотрим разные варианты разверты-
вания шлюзов Power BI, обычно используемых для подключения к внешним
источникам данных. Важность этой темы обусловлена тем, что пользовате-
лям зачастую требуется оперировать одновременно актуальными и истори-
ческими данными, объем которых ничем не ограничен.
Глава 3 «Оптимизация DirectQuery». В третьей главе книги мы позна-
комимся с режимом хранения DirectQuery, полагающимся на внешние ис-
точники данных. Этот режим, как правило, используется в организациях
при наличии больших объемов данных. Источники DirectQuery зачастую
не предназначены для аналитических запросов, что негативно сказывается
на быстродействии отчетов и операций обновления данных. Мы рассмот
рим методы оптимизации как в отношении Power BI, так и применительно
к внешним источникам, что позволит повысить эффективность запросов.
Глава 4 «Анализ логов и метрик». В этой главе мы поговорим о том, что
быстродействие отчетов может быть улучшено только в случае ее объектив-
ной оценки. Таким образом, здесь мы узнаем, где можно взять данные о про-
изводительности и как по ним определить наличие узких мест в системе.
Будут рассмотрены встроенные и внешние инструменты для мониторинга
показателей эффективности, а также даны полезные рекомендации по про-
ведению такого анализа.
Глава 5 «Анализатор производительности». Здесь мы поговорим об
одном из самых простых способов отслеживания временных задержек при
формировании отчетов. Мы воспользуемся инструментом Анализатор про-
изводительности, служащим для проведения подробного анализа действий
пользователей с детализацией до визуальных элементов. Мы выполним рас-
ширенный обзор всех возможностей, опишем все метрики и продемонстри-
руем процесс анализа на примере.
Глава 6 «Внешние инструменты». Данная глава будет посвящена сто-
ронним инструментам, способным помочь при анализе производительности
решений. Мы рассмотрим типичные сценарии использования таких инстру-
ментов с подключением к Power BI, сбором ключевых показателей эффектив-
ности и их подробным анализом.
18 Введение
будет дана в следующем разделе). Это поможет вам избежать ошибок при
копировании скриптов из книги.
Сопроводительные файлы
Файлы с примерами можно загрузить из репозитория книги на GitHub по
адресу https://github.com/PacktPublishing/Microsoft-Power-BI-Performance-Best-
Practices. Все возможные обновления будут появляться там же.
Также вы можете загрузить текущую версию файлов с сайта издательства
по адресу www.dmkpress.com на странице с описанием данной книги.
Цветные изображения
По следующей ссылке вы можете скачать в виде PDF все рисунки и диа-
граммы, использованные в книге: https://static.packt-cdn.com/downloads/
9781801076449_ColorImages.pdf.
Условные обозначения
На протяжении книги мы будем использовать следующие условные обозна-
чения и шрифты.
Код в тексте: так в тексте книги мы будем обозначать код, имена таблиц
баз данных, имена папок, файлов, расширения файлов, пути, ссылки, поль-
зовательский ввод. Пример: «Просто скопируйте приведенный ниже код,
выполните его, после чего перезапустите TabularEditor, чтобы применились
новые правила».
Блоки кода будут выделены следующим образом:
System.Net.WebClient w = new System.Net.WebClient();
string path = System.Environment.GetFolderPath(System.Environment.SpecialFolder.
LocalApplicationData);
string url = "https://raw.githubusercontent.com/microsoft/Analysis-Services/master/
BestPracticeRules/BPARules.json";
string downloadLoc = path+@"\TabularEditor\BPARules.json";
w.DownloadFile(url, downloadLoc);
Analysis Services
Группа (на базе Power BI)
OneDrive
Обновление по расписанию /
Шлюз Динамическое подключение /
DirectQuery
Локальные источники данных
Analysis Services, SQL Server и т. д.
Обновление по расписанию /
Шлюз Динамическое подключение /
Локальные источники данных DirectQuery
Analysis Services, SQL Server и т. д.
Режим Import
При использовании наборов данных в режиме Import разработчики могут
испытывать проблемы с задержками от пользовательского интерфейса при
работе с Power Query или языком запросов M в Power BI Desktop. В исклю-
чительных случаях это может привести к увеличению сроков разработки
операций преобразования данных с часов до дней. После развертывания
решения проблемы в этой области могут негативно сказываться на времени
Области с возможными замедлениями 27
Режим DirectQuery
При использовании режима DirectQuery данные физически остаются в ис-
точнике, что предполагает необходимость их извлечения и обработки в Po
wer BI практически при каждом взаимодействии пользователя с системой.
При применении этого режима проблемы обычно возникают в отношении
скорости формирования отчетов пользователем. Визуальные элементы будут
загружаться дольше, пользователи будут нервничать, прерывать загрузку
и пытаться взаимодействовать с другими элементами или менять фильтры.
Это само по себе может привести к увеличению количества отправляемых
запросов, что еще больше замедлит процесс формирования отчетов за счет
дополнительных операций загрузки из внешних источников.
Шлюз Power BI
Шлюз (gateway) Power BI – это промежуточный компонент, использующийся
для подключения к внешним источникам данных. Обычно он располагается
в той же физической или виртуальной сети и обеспечивает безопасное ис-
ходящее соединение с Power BI, по которому могут передаваться данные для
отчетов и обновлений.
Но функции шлюза не ограничиваются передачей данных – это распро-
страненное и очень большое заблуждение. Помимо обеспечения защищен-
ного соединения с источниками данных, шлюз содержит свой движок об-
работки (mashup engine), выполняющий преобразование исходных данных
и их сжатие перед отправкой в службу Power BI. При отсутствии оптимизации
шлюза могут возникать задержки с обновлением данных вплоть до сбоев,
замедление взаимодействий пользователей с отчетами и отказы загрузки
визуальных элементов из-за превышения времени выполнения запросов.
28 Постановка целей и определение проблемных областей
Обновление по расписанию /
Динамическое подключение / DirectQuery Конечные пользователи
Обновление по расписанию /
Шлюз Динамическое подключение /
Локальные источники данных DirectQuery
Analysis Services, SQL Server и т. д.
Сетевая задержка
Сетевая задержка (network latency) выражается во времени, необходимом для
передачи порции данных из одной точки сети в другую. Этот показатель из-
меряется в миллисекундах, и обычно для этого используется утилита ping.
При помощи нее фиксируется время, затраченное на отправку небольшого
пакета информации в место назначения и получения ответа о его успешной
доставке адресату. Если это время исчисляется секундами, вас могут ждать
серьезные проблемы. Основными факторами, влияющими на сетевую за-
держку, являются географическое расстояние между точками, количество
транзитных участков, или так называемых прыжков (hops), на пути и загру-
женность сети в целом.
На рис. 1.5 показаны пути, по которым данные могут перемещаться в Po
wer BI. Стоит отметить, что для каждой стрелки может быть характерна своя
сетевая задержка, а значит, разные пользователи могут ощущать разную
скорость передачи данных при работе с системой.
Обновление по расписанию /
Шлюз Динамическое подключение /
DirectQuery
Локальные источники данных
Analysis Services, SQL Server и т. д.
Служба Power BI
Служба Power BI (Power BI service), выделенная на рис. 1.6, является важней-
шей составляющей любого решения на базе Power BI. Системные компо-
ненты службы в большинстве своем не поддаются управлению со стороны
разработчиков и пользователей. Вместо этого их стабильность и быстро-
действие контролируются компанией Microsoft. Исключениями являются
емкости Power BI Premium и Power BI Embedded, инфраструктура которых
по-прежнему контролируется Microsoft, но администраторы организации
имеют доступ к управлению выделенными им емкостями. Подробно об этом
мы будем говорить в главе 13.
Обновление по расписанию /
Динамическое подключение / DirectQuery Конечные пользователи
Обновление по расписанию /
Шлюз Динамическое подключение /
DirectQuery
Локальные источники данных
Analysis Services, SQL Server и т. д.
Заключение
Как вы узнали из этой главы, интерактивное взаимодействие с аналитиче-
скими отчетами очень напоминает работу с обычными веб-приложениями,
в связи с чем при определении степени удовлетворенности пользователей
Заключение 31
В общем виде принято считать, что использование режима Import совместно с движ-
ком xVelocity позволяет снизить занимаемое моделью место в 5–10 раз. Например,
датасет в Power BI на основе исходных данных объемом 1 Гб может занимать порядка
100–200 Мб. Зачастую можно добиться и большей степени сжатия в зависимости от
кратности (cardinality) данных в столбцах.
Выбор между режимами Import и DirectQuery – это, конечно, компромисс. Режим Im-
port дает вам максимальную скорость выполнения запросов, но с необходимостью
настраивать механизм обновления данных и мириться с тем, что иногда придется
довольствоваться информацией не первой свежести. В то же время режим Direct-
Query обеспечивает полную гарантию актуальности извлекаемых данных и позво-
ляет оперировать объемами информации, превышающими ограничения, принятые
в Power BI. Но взамен вам придется пожертвовать скоростью выполнения запросов,
да и хранилище в источнике, вероятно, придется подвергнуть оптимизации.
Составные модели
Power BI не ограничивает вас выбором единственного режима (Import или
DirectQuery) для одного набора данных или файла .pbix. Вместо этого до-
38 Обзор архитектуры и конфигурации Power BI
пустимо сочетать одну или несколько таблиц в режиме Import с одной или
несколькими таблицами в режиме DirectQuery. Такой совмещенный подход
получил название составная модель (composite model). При выборе составной
модели таблицы, хранящиеся в режиме Import и DirectQuery, могут быть оп-
тимизированы так же точно, как и при использовании одного из этих режи-
мов. В то же время при совместном использовании с агрегатами, о которых
мы подробно поговорим в главе 10, составная модель позволит вам найти
нужный баланс между быстродействием отчетов, актуальностью информа-
ции, размером набора данных и временем его обновления.
Режим LiveConnect
В режиме LiveConnect отчет будет отправлять запросы по требованию к внеш-
нему набору данных Analysis Services. В этом отношении он похож на режим
DirectQuery, поскольку Power BI не хранит информацию в локальном наборе
данных. Отличие состоит в том, что режим LiveConnect можно использовать
только при работе с Analysis Services. При этом нельзя производить модели-
рование данных и добавлять вычисления DAX. Отчет Power BI будет посылать
нативные запросы DAX к внешнему источнику данных. Режим LiveConnect
можно использовать в приведенных ниже сценариях:
создание отчетов из наборов данных, доступных в рабочей области
Power BI, в Power BI Desktop или Power BI Web;
ваша компания инвестировала средства в Azure Analysis Services или
SQL Server Analysis Services и использует этот источник в качестве ос-
новного для отчетов Power BI. Основные причины для выбора здесь
режима LiveConnect следующие:
a) вам нужен полный контроль за секциями, временем обновления
данных, масштабированием и разделением нагрузки по запросам
и обновлениям;
b) интеграция с CI/CD (непрерывная интеграция и непрерывная по-
ставка) и другими конвейерами автоматизации;
c) требования детализированного контроля и диагностики Analysis
Services;
d) размер изначального набора данных не укладывается в ограниче-
ния емкости Premium.
На рис. 2.4 показан сценарий с использованием режима LiveConnect.
Azure
Analysis Services
Конечные пользователи
Отчеты
Power BI
Desktop Analysis Services
(на базе Служба Power BI
Power BI)
Шлюз
Локальный
SQL Server Analysis Services
Облачные службы
Power BI Power Apps Microsoft Flow Azure Analysis Services Azure Logic apps
Масштабирование шлюза
Иногда бывает, что даже при должном мониторинге и управлении шлюзом
вы упираетесь в его естественные ограничения по причине роста объема
данных или интенсивности их использования. В таких ситуациях стоит за-
думаться о проведении масштабирования (scaling) шлюза, заключающегося
в выделении дополнительных ресурсов или замене старых на более быстрые.
О необходимости масштабирования ресурсов могут говорить цифры, полу-
ченные в результате анализа производительности системы, а именно об
использовании процессора, памяти и дискового пространства. Оптимиза-
цию невозможно проводить до бесконечности, и иногда вы все же будете
упираться в физические ограничения, что должно стать для вас сигналом
к рассмотрению вариантов, связанных с масштабированием.
Предположим, с оптимизацией решения у вас полный порядок, но вы все
равно замечаете проблемы с быстродействием, вызванные повышением на-
грузки. Вашим первым выбором должно стать вертикальное масштабирова-
ние (scale up) ресурсов. Вы можете увеличить количество ядер центрального
процессора и объем памяти независимо друг от друга, если результаты ваше-
го анализа показывают, что проблема только в одном аспекте, а в остальных
все в порядке. Хотя процессор и память – это первое, о чем стоит задуматься
при вертикальном масштабировании, не стоит забывать также о доступном
месте на диске и пропускной способности сети. Эти компоненты также могут
быть масштабированы вертикально, но может потребоваться и горизонталь-
ное масштабирование.
Заключение
Из этой главы вы узнали, как работают два режима хранения данных в Po
wer BI. Наборы данных в режиме Import полностью кешируются в памяти,
тогда как режим DirectQuery позволяет оставить данные физически на сто-
роне источника и подключаться к ним при каждом выполнении запросов.
В целом режим Import является более быстрым, поскольку данные фактиче-
ски извлекаются из локальной колоночной базы данных, в которой к тому
же реализовано сжатие. В то же время режим DirectQuery гарантирует по-
лучение актуальной информации из источника и не предусматривает на-
личия операций обновления данных. К тому же при использовании этого
режима вы можете работать с данными гораздо большего объема по срав-
нению с ограничениями, имеющимися в лицензии Power BI Premium. Таким
образом, у каждого из двух режимов есть свои преимущества и недостатки.
В дополнение к режимам Import и DirectQuery в Power BI реализована также
составная модель, сочетающая в себе плюсы обоих режимов.
Кроме того, в этой главе мы поговорили о шлюзах, позволяющих Power BI
безопасно подключаться к локальным источникам данных. При этом шлюз
используется не просто как путепровод для информации, а содержит движок
обработки, позволяющий локально выполнить необходимые преобразова-
ния данных. Эта операция может потребовать больших ресурсов, особенно
если с системой одновременно работают сотни или тысячи пользователей,
что порождает огромное количество параллельных подключений. Все это
ведет к необходимости тщательно мониторить работу шлюза, поддерживать
52 Обзор архитектуры и конфигурации Power BI
тель меняет значение фильтра или среза в отчете. Это значительно повышает
эффект интерактивности, но может существенно снизить эффективность при
работе с загруженными или не оптимально настроенными источниками Direc-
tQuery, а также в случае большой сложности посылаемых на сервер запросов.
Это происходит из-за того, что источник может не успеть обработать одно
изменение визуального элемента пользователем к моменту, когда он уже из-
менил свой выбор. В результате количество запросов увеличивается.
Настройка снижения количества отправляемых на сервер запросов по-
зволяет добавить в секции фильтров и срезов кнопку Применить (Apply).
Таким образом, пользователь сможет выполнить сразу несколько изменений
настроек и отправить их на сервер вручную по готовности. На рис. 3.8 по-
казан фрагмент отчета со срезом и фильтром после применения настроек из
секции уменьшения числа отправляемых запросов.
Заключение
В этой главе мы определили моделирование данных как процесс выбора
столбцов для группировки в таблицы и настройку связей между таблицами.
Мы узнали, что для оптимальной работы режима DirectQuery необходимо
стараться по максимуму упрощать вычисления на этапе преобразования
данных в Power Query, чтобы гарантировать их бесшовную трансформацию
в запросы на родном для источника данных языке. Попутно мы научились
просматривать эти итоговые запросы к источнику в редакторе Power Query
и увидели, как именно вычисления в Power BI преобразуются в запросы SQL.
После этого мы рассмотрели возможность объединения таблиц в режиме
DirectQuery непосредственно в Power BI даже в отсутствие соответствующих
связей в источнике данных. Эта опция должна использоваться с большой
осторожностью. В любом случае с точки зрения оптимизации всегда луч-
ше воспользоваться связями и ссылочной целостностью, определенными во
внешнем источнике, а не в Power BI, поскольку это обеспечит более эффек-
тивную фильтрацию и объединение исходных данных. Мы также упомянули
про дополнительные настройки для связей и рассказали об их влиянии на
наборы данных в режиме DirectQuery.
Затем мы обратились к параметрам и настройкам Power BI Desktop, с по-
мощью которых можно оказывать влияние на процесс осуществления па-
раллельных запросов к источнику данных. Также мы перечислили наиболее
распространенные приемы оптимизации, которые подойдут практически
ко всем источникам данных и помогут повысить эффективность моделей
DirectQuery. Эти приемы могут потребовать объединения усилий с админи-
страторами баз данных в источнике в процессе выбора наиболее оптималь-
ных решений для взаимодействия с Power BI.
В следующей главе мы погрузимся в мир показателей производитель-
ности, доступных в Power BI, и узнаем, к каким данным они обеспечивают
доступ и как могут влиять на быстродействие решений.
Часть II
Анализ, улучшение
и управление
производительностью
По умолчанию при создании копии отчета его новая версия будет поме-
щена в ту же рабочую область, где располагается оригинал. Вам нет необхо-
Метрики использования в Power BI 71
Теперь давайте узнаем, на что именно стоит обращать внимание при ана-
лизе данных о производительности и что делать с полученными результа-
тами.
Заключение
Поскольку производительность отчетов является довольно важной и обшир-
ной темой, мы начали главу с обзора встроенных шаблонов анализа метрик
использования в Power BI, которыми могут воспользоваться администраторы
рабочей области.
Сперва мы научились формировать отчет по метрикам использования. Мы
подробно рассмотрели содержимое вкладки с производительностью отчета
и узнали, как можно анализировать показатели в разрезе браузеров, место-
положения пользователей и методов развертывания отчетов. Мы отметили,
что представленная в отчете агрегированная информация является отлич-
ной отправной точкой для анализа, но для возможности детального разбора
ситуации вам понадобятся данные с более высоким уровнем грануляции.
С целью их получения мы научились сохранять копию исходного отчета и на-
страивать ее, анализировать сырые данные в Excel и подключаться к набору
данных с метриками использования из Power BI Desktop. Все эти методы
помогут вам получать детальную информацию и выводить ее в нужном вам
виде. Попутно мы подробно разобрали назначение всех таблиц в наборе
данных и описали работу с несколькими рабочими областями Power BI одно-
временно. В завершение первой части главы мы сформулировали и ответили
на наиболее типичные вопросы, связанные с производительностью, рассмот
Материалы к прочтению 85
Материалы к прочтению
Чтобы лучше усвоить темы, которые мы затрагивали в этой главе, советуем
вам ознакомиться с материалами, ссылки на которые приведены ниже:
Rest API Get Activity Events: https://learn.microsoft.com/ru-ru/rest/api/
power-bi/admin/get-activity-events;
командлет PowerShell Power BI Management: https://www.powershell-
gallery.com/packages/MicrosoftPowerBIMgmt/1.2.1104;
Microsoft 365 Compliance Search: https://compliance.microsoft.com;
командлеты Microsoft 365 PowerShell: https://learn.microsoft.com/
ru-ru/microsoft-365/compliance/search-the-audit-log-in-security-and-
compliance?view=o365-worldwide.
Глава 5
Анализатор
производительности
Технические требования
Некоторые темы из этой главы предполагают наличие примеров. Мы будем
упоминать файлы, с которыми будем работать. Все их вы сможете найти
в папке Chapter05 в хранилище GitHub по адресу https://github.com/PacktPub-
lishing/Microsoft-Power-BI-Performance-Best-Practices.
Обзор Анализатора производительности 87
движка Analysis Services. Это время должно быть чуть большим, чем
в анализе запроса DAX из отчета о производительности от движка Anal-
ysis Services, поскольку сюда включаются сетевые задержки и прочие
накладные расходы;
Запрос Direct (Direct query): этот пункт появляется только для источ-
ников в режиме DirectQuery в присутствии запросов. Показанное время
отмеряется с момента отправки внешнего запроса движком Analysis
Services до получения результатов. Это время должно соответствовать
метрике для событий класса DirectQuery в движке Analysis Services;
Визуальное отображение (Visual display): здесь демонстрируется вре-
мя, необходимое для отрисовки визуальным элементом полученных
данных. В это время включается загрузка внешнего контента, напри-
мер изображений, и операции геокодирования. Плохо реализованные
или сложные пользовательские элементы визуализации могут требо-
вать значительного времени для отрисовки;
Другое (Other): к этой категории относятся все события визуального
элемента, не связанные с отрисовкой, такие как подготовка запросов
и прочие операции фоновой обработки данных. Также сюда включает-
ся время ожидания других визуальных элементов. Это происходит по
причине того, что все элементы визуализации используют один поток
(thread) и, если говорить очень упрощенно, каждый из них обрабаты-
вается процессором последовательно. Всякий раз, когда вы добавляе-
те новый визуальный элемент на страницу, этот показатель для всех
остальных элементов будет увеличиваться. Это не обязательно плохо,
но может негативно сказаться на времени тяжелых в плане визуализа-
ции отчетов. Более подробно о проблемах, связанных с визуализацией
элементов, мы поговорим в главе 9.
Обновление визуального элемента не обязательно приводит к запуску запроса в со-
ответствующем источнике данных. Клиент Power BI хранит локальный кеш результа-
тов вычислений, так что может себе позволить не запускать запрос заново при пере-
ключении между недавно отфильтрованными представлениями. Этим объясняется,
почему для некоторых визуальных элементов, основывающихся на данных, может
отсутствовать пункт с запросом DAX. Чтобы инициировать отправку запроса, необхо-
димо нажать на ссылку Обновить визуальные элементы (Refresh visuals) на панели
анализатора производительности.
Здесь мы видим, что выпадающий список сначала был открыт, после чего
было выбрано значение, о чем свидетельствует действие Изменил срез
(Changed a slicer). При этом не вполне очевидно, что первый пункт описывает
именно действие пользователя, поскольку внешне он выглядит как общее
обновление визуального элемента. Если продолжить этот пример и снова
открыть выпадающий список, все станет еще более запутано. На рис. 5.3 вид-
но, что в нашей панели добавилось событие открытия выпадающего списка
к предыдущему действию Изменил срез (Changed a slicer).
Единообразие тестов
Как вы знаете, при открытии файла с расширением .pbix в Power BI Desktop
набор данных автоматически загружается в память. При этом для моделей
с режимом хранения Import файл в памяти может занимать довольно много
места – до нескольких гигабайт. Наверняка вы замечали, что Power BI Desk-
top дольше открывается при работе с объемными файлами. Большая часть
времени при этом требуется для переноса набора данных с диска в память.
Эта концепция применима и к службе Power BI после развертывания в ней
своего набора данных.
При этом служба Power BI не удерживает все наборы данных в памяти по-
стоянно. Вместо этого она использует сложные эвристические алгоритмы
в попытках очистить память, насколько это возможно. Если вы на протяже-
нии какого-то времени не используете набор данных, то можете заметить
некоторую задержку при первом открытии отчета. Несмотря на использова-
ние компанией Microsoft очень эффективных методов хранения и передачи
данных, эта задержка при работе с большими файлами может быть довольно
значительной и превышать комфортные 8–10 секунд из рекомендации о вре-
мени загрузки отчетов, которую мы упоминали в главе 1. Учитывайте этот
аспект при сравнении быстродействия отчетов в Power BI Desktop и служ-
бе и старайтесь сделать все, чтобы исключить подобные выбросы из своих
метрик производительности при их оценке. Кроме того, до пользователей
также стоит донести эту особенность работы с системой при первом запуске
отчетов, особенно если отчеты несут критически важную информацию или
используются большой группой людей.
Любые дискуссии о производительности отчетов должны включать в себя
поправки на кеширование данных. Кеширование – это давно и отлично за-
рекомендовавший себя механизм повышения быстродействия часто исполь-
зуемых сценариев при помощи локального хранения результатов расчетов
для их быстрого повторного использования. В Power BI довольно активно
используется методика кеширования данных. В то же время это может нега-
тивно сказываться на репрезентативности проводимых вами исследований
в области производительности, поскольку первые запуски будут серьезно
уступать всем последующим.
При открытии существующего файла в Power BI Desktop будет открыта
страница, которая была активной в момент сохранения файла. На этой стра-
нице могут располагаться различные визуальные элементы, которые долж-
ны будут загрузиться, отправить запросы и отрисоваться, прежде чем вы
сможете продолжить работу с Power BI Desktop. Даже если вы сразу откроете
Анализатор производительности и запустите тестирование, кеширование
на клиенте и в Analysis Services неизбежно повлияет на быстродействие.
Лучшим решением этой проблемы при выполнении анализа производитель-
ности в Power BI Desktop является создание пустой страницы.
94 Анализатор производительности
Добавьте пустую страницу в свой отчет при проведении теста производительности
в Power BI Desktop. Сохраните файл с открытой в этот момент пустой страницей и за-
кройте Power BI Desktop. Откройте программу снова и убедитесь, что по умолчанию
открывается созданная пустая страница. Теперь ни один запрос не подключается
к набору данных, а значит, кеширование производиться не будет.
Если ваши пользователи работают из разных мест и у вас нет возможности запускать
тесты из их локаций, вы можете смоделировать приблизительно похожие сетевые
условия при помощи виртуальных машин (virtual machine – VM), поднятых в тех же
регионах. Арендовать виртуальные машины сегодня можно почти у любого облачно-
го провайдера, и за несколько часов теста вам придется заплатить совсем немного.
Медленные запросы
Существует масса причин, по которым может страдать скорость выполне-
ния запросов. При тестировании в Power BI Desktop вы будете главным об-
разом обращать внимание на эффективность модели данных и выражений
DAX, особенно если работаете с локальным набором данных, содержащимся
в файле .pbix. Если исключить внешние факторы, обычно вмешивающиеся
после развертывания реального проекта, причины замедления запросов мо-
гут сводиться к следующим:
запрос возвращает объемный набор данных в виде результата;
запрос содержит обращение к сложным и неэффективным мерам;
запрос оперирует слишком большим набором данных, возможно с объ-
единениями с высокой кратностью;
модель данных не отвечает рекомендованным требованиям;
комбинация перечисленных факторов.
На рис. 5.9 продемонстрированы два табличных визуальных элемента из
отчета, показывающих суммы продаж и количество товаров с группировкой
по номеру счета (account number). Здесь используется простая мера с сум-
мированием по полю LineTotal и подсчет уникального количества товаров
красного цвета. Медленная (слева) и быстрая (справа) меры дают одинаковые
результаты, хотя выражения DAX используются немного разные.
Определение и устранение проблем с производительностью 99
FILTER(
'SalesOrderDetail',
RELATED('Product'[Color]) = "Red"))
UniqueRedProducts_Fast =
CALCULATE(
DISTINCTCOUNT('SalesOrderDetail'[ProductID]), 'Product'[Color]
= "Red")
Заключение
В этой главе мы познакомились со встроенным инструментом Power BI под
названием Анализатор производительности (Performance Analyzer), помога-
ющим оценивать быстродействие и эффективность действий пользователей
на основе визуальных элементов. На панели инструмента события отобража-
ются с разделением на категории обработки запроса, отрисовки визуальных
элементов и выполнения прочих действий. Это позволяет понять, где именно
возникли проблемы. Кроме того, с помощью Анализатора производительно-
сти можно оценить различные метрики, а также скопировать запросы DAX
и DirectQuery для дальнейшего разбора в сторонних инструментах. Вместе
с тем вы можете выгрузить целый лог-файл для будущего анализа.
Мы рассмотрели различные типы действий пользователей, перехватыва-
емые анализатором, и узнали, какие метрики производительности для них
используются. Также мы отметили случаи, когда действия трудно отличить
друг от друга.
После этого мы дали несколько полезных советов по проведению тестов на
производительность в Power BI Desktop, включая создание пустой страницы
в отчете, обеспечение единообразия условий и создание максимально со-
вместимой копии реальной базы для теста. Мы акцентировали ваше внима-
ние на том, что даже при успешной оптимизации в Desktop проблемы могут
появиться вновь при увеличении количества пользователей и повышении
объема данных в рабочей системе. Вы должны помнить, что всегда могут
вмешаться внешние факторы, влияющие на скорость работы опубликован-
ных в службе Power BI отчетов.
Далее мы посмотрели, как Анализатор производительности справляется
с идентификацией медленных запросов и визуальных элементов, и разо-
брали практические примеры для обоих случаев. Мы перечислили возмож-
ные причины замедления запросов и элементов визуализации и узнали, как
108 Анализатор производительности
Технические требования
Для некоторых примеров из этой главы мы подготовили сопроводитель-
ные материалы, на которые будем ссылаться при обсуждении тех или иных
приемов. Все нужные файлы располагаются в папке Chapter06 в хранилище
GitHub по адресу https://github.com/PacktPublishing/Microsoft-Power-BI-Perfor-
mance-Best-Practices.
Power BI Helper
Power BI Helper обладает целым рядом возможностей для исследования,
документирования и сравнения локальных файлов Power BI Desktop. Также
этот инструмент позволяет просматривать и экспортировать метаданные из
службы Power BI, такие как списки рабочих областей и наборов данных с их
свойствами. Power BI Helper можно загрузить по адресу https://powerbihelper.
org.
В предыдущих главах мы не раз указывали на то, как важно стараться со-
хранять объем наборов данных Power BI максимально небольшим, избавля-
ясь от лишних таблиц и столбцов. В Power BI Helper есть для этого необходи-
мые средства, так что этот инструмент вполне может быть включен в процесс
оптимизации решений перед их публикацией.
Tabular Editor
Tabular Editor доступен как в виде коммерческой версии, так и с откры-
тым исходным кодом. Первая предлагает более расширенные возможности
и специализированную поддержку, которая может оказаться очень полезной
разработчикам Power BI. Но, к счастью, бесплатная версия на момент напи-
сания книги содержит весь базовый функционал инструмента и может быть
загружена из хранилища GitHub по адресу https://github.com/TabularEditor/
TabularEditor.
Tabular Editor представляет собой инструмент для повышения произво-
дительности, который может быть эффективно использован в разработке как
дополнение Power BI Desktop или Microsoft Visual Studio. Мы не будем под-
робно останавливаться на всех функциональных возможностях этого инстру-
мента, поскольку это выходит за рамки данной книги. В то же время Tabular
Editor обладает огромной популярностью в среде разработчиков Power BI,
и мы настоятельно рекомендуем вам самостоятельно изучить этот инстру-
мент, если вы планируете проектировать модели данных производственно-
го масштаба. Вы можете начать с документации к Tabular Editor, в которой
описан весь основной функционал этого инструмента. Мы же подробно оста-
новимся на утилите, входящей в состав Tabular Editor, под названием Best
Practice Analyzer.
На этом рисунке мы также видим, что тип (Data Type) этого столбца указан
как String, что подразумевает хранение алфавитно-цифровых символов. Из
всего этого можно предположить, что в этом столбце содержатся длинные
текстовые данные, плохо поддающиеся сжатию. На самом деле в этой ко-
лонке находятся тексты запросов DAX и DirectQuery из трассировки движка
Analysis Services, загруженной в Power BI. Это знание может позволить вам
принять решение о нецелесообразности хранения информации в модели
данных с таким уровнем детализации. В качестве альтернативы вы можете
осуществлять хранение подобных данных как-то иначе или просто ограни-
чить данные в этой таблице несколькими днями либо неделями.
Теперь давайте узнаем, как DAX Studio способен помочь нам проанализи-
ровать и повысить производительность решения.
На рис. 6.15 показано, как можно найти нужную вам меру и, выбрав пункт
Define Measure в контекстном меню, перенести определение меры в редак-
тор запросов.
Заключение
В этой главе мы представили и обсудили несколько полезных утилит, ис-
пользующих разные методы и подходы в работе с Power BI и помогающих
в обнаружении областей для улучшения производительности. Все их можно
применять в качестве дополнений к официальным инструментам от Micro-
soft в процессе оптимизации решений.
Мы узнали, что рассмотренные инструменты обладают достаточно бога-
тым функционалом, помимо управления производительностью, так что мы
настоятельно рекомендуем вам самостоятельно изучить их во всех подроб-
ностях и начинать применять в процессе работы. Единственной преградой
может быть то, что в бесплатных версиях приложений зачастую отсутствует
официальная поддержка производителя.
Первым инструментом, с которым мы познакомились, был Power BI Helper.
В его возможности входит идентификация столбцов, занимающих неоправ-
данно много места, неиспользуемых колонок, двунаправленных связей и за-
висимостей между мерами. Все эти аспекты тесно переплетаются с вопро-
сами повышения производительности.
После этого мы узнали об очень полезном инструменте Tabular Editor со
встроенным в него расширением Best Practice Analyzer (BPA). Эта связка по-
зволяет импортировать разработанные специалистами правила для моделей
данных и сканировать наборы данных на соответствие рекомендациям, свя-
занным с производительностью. Кроме того, с помощью BPA мы можете при
необходимости применить рекомендованные изменения к модели данных
после первого же открытия.
Далее мы познакомились с DAX Studio и VertiPaq Analyzer. DAX Studio яв-
ляется полноценным и развитым инструментом для написания и отладки
запросов на языке DAX, который ко всему прочему умеет перехватывать
запросы к наборам данных Power BI в реальном времени и анализировать
их быстродействие. Мы также научились создавать метрики, дающие пол-
ную информацию об объектах в наборе данных и занимаемом ими месте.
После этого мы поговорили о составляющих времени выполнения запро-
сов, вскользь упомянув о движке формул и движке хранилища и их роли
в процессе обработки данных запросов. Также мы научились получать до-
ступ к внутренним запросам VertiPaq, отправленным на исполнение. А воз-
Заключение 127
Налаживание воспроизводимого
и упреждающего процесса повышения
производительности
В главе 1 мы говорили о потенциальных негативных последствиях в работе
неоптимально настроенной системы бизнес-аналитики. Прекрасно, когда
есть инструменты и метрики для отслеживания подобных проблем. Но на
практике я чаще всего сталкиваюсь с тем, что такие инструменты начинают
использовать только после того, как возникшие проблемы с производитель-
ностью нанесут значительный урон предприятию – достаточный для того,
чтобы информация об этом дошла до руководства, разработчиков и адми-
нистраторов. Это не лучший сценарий для бизнеса по приведенным ниже
причинам:
производить структурные изменения в рабочем окружении бывает
очень проблематично, для этого недостаточно просто выкатить тех-
нические обновления. Кроме того, при таких обширных изменениях
на уровне отчетов или набора данных нередко требуется провести до-
полнительное обучение персонала и обновить всю инструкцию и до-
кументацию;
руководство может ставить сильно ограниченные сроки для решения
возникших проблем. В то же время поиск первопричин, разработка
обновлений и развертывание системы зачастую требуют достаточно
большого времени, и в условиях строгих ограничений разработчики
способны допускать еще более серьезные ошибки, которые могут при-
вести к новым проблемам;
организация может попросту не располагать техническим отделом,
способным решать масштабные проблемы, по причине недостатка ква-
лификации или численного состава. Это может приводить к большим
задержкам и росту недовольства пользователей системы.
Теперь давайте посмотрим, что из себя представляет цикл управления
производительностью.
130 Общие принципы управления производительностью
Установка/обновление
контрольных целевых
показателей
Принятие Мониторинг
превентивных мер и хранение истории
Обнаружение проблем
Диагностирование и расстановка
и исправление приоритетов
Диагностирование и исправление
Обнаруженные проблемы нужно описывать и решать, как мы показывали
в двух предыдущих главах. Первое, что необходимо сделать, – это опреде-
лить источник проблемы. Используя отчет в качестве примера, вы можете
сделать вывод о том, что один из визуальных элементов долго прорисо-
вывается или мера долго считается. А может быть, проблема в фильтре
безопасности. В следующих главах мы детально рассмотрим методы реше-
ния проблем.
При решении проблем с производительностью отчета лучше всего начать с визуаль-
ных элементов. Даже если вам удастся устранить недостаток при помощи модифика-
ции запроса DAX или оптимизации модели данных, на безопасное внедрение этих
изменений может потребоваться немало времени, поскольку при этом могут быть
затронуты разные зависимости в наборе данных. Что касается слоя визуальных эле-
ментов, то в него можно вносить изменения независимо и даже в процессе работы
системы.
BI-системы самообслуживания
К BI-системам самообслуживания (self-service BI) относятся системы, к ко-
торым обращаются пользователи с целью проведения анализа данных, не
обладая при этом большими знаниями и достаточными навыками в обла-
сти статистики и аналитики данных. Использование таких систем зачастую
является наиболее быстрым способом получения необходимых сведений
и построения выводов. Пользователи могут сами загружать, преобразовы-
вать и манипулировать данными наиболее подходящим для них способом.
Более того, в процессе работы они вольны использовать как официальные,
так и неофициальные источники данных, включая информацию из внешних
источников, например о численности населения или погоде. Эти системы
работают в основном по принципу модели с пассивным источником данных
(pull model), когда пользователи сами ищут нужную им информацию и строят
на ее основании отчеты.
136 Общие принципы управления производительностью
Заключение
В этой главе мы описали суть воспроизводимых процессов, которые могут
помочь вам управлять производительностью в проактивной упреждающей
манере. Это очень важно для общей стабильности и комфортной работы
пользователей. Если вы сможете выявить и решить проблемы до момента
их повсеместного распространения, то сэкономите себе и компании много
времени и денег.
Мы узнали, как определять контрольные ожидаемые показатели в качестве
отправной точки для анализа производительности и как важно соблюдать все
необходимые условия в отношении модели данных, страниц отчетов, полно-
мочий пользователей и прочих факторов для установки этих показателей.
Также мы упомянули о важности хранения истории метрик производитель-
ности, чтобы в дальнейшем можно было отследить зависимости наподобие
сезонности. Кроме прочего, мы отметили, что при обнаружении проблем
необходимо правильно расставить приоритеты для предпринимаемых мер,
исходя из их ценности для компании и комфорта пользователей, а опыт
возникновения неполадок внести в стандарты и инструкции во избежание
повторения подобных ситуаций в будущем.
В завершение главы мы поговорили о важности совместной работы разных
отделов компании над вопросами производительности системы и написа-
ния инструкций, помогающих избежать распространенных ловушек. Мы
рассмотрели наиболее популярные сценарии и роли – от BI-систем само-
обслуживания до корпоративных или управляемых ИТ-отделами систем.
Заключение 139
Технические требования
Для некоторых примеров из этой главы мы подготовили сопроводитель-
ные материалы, на которые будем ссылаться при обсуждении тех или иных
приемов. Все нужные файлы располагаются в папке Chapter08 в хранилище
GitHub по адресу https://github.com/PacktPublishing/Microsoft-Power-BI-Perfor-
mance-Best-Practices.
Логи запросов могут оказываться очень объемными, что затрудняет работу с ними.
Редактор Power Query выполняет различные фоновые операции и кеширование для
ускорения выполнения запросов, так что в диагностике могут быть отображены не все
шаги. Мы рекомендуем запускать диагностику только для тех операций или таблиц,
которые вам необходимо проанализировать. Это позволит сократить размер логов.
Запускайте диагностику, выполняйте действие, затем сразу останавливайте трасси-
ровку и переходите к анализу логов.
лями и т. д. Все данные хранятся в SQL Server. Для этого примера мы все эти
таблицы по отдельности загрузили в Power BI Desktop, что видно на рис. 8.16.
Затем мы сохранили данные из таблицы фактов, находящейся в базе данных,
в файле CSV с именем Fact Sale_disk, чтобы использовать его в качестве аль-
тернативного источника данных для сравнения.
Заключение
В этой главе мы начали погружение в недра решений Power BI и первым
делом рассмотрели процессы загрузки и преобразования данных. Мы уви-
дели, что основная роль на этих этапах отводится Power Query и его движку
обработки с языком запросов M. Мы также узнали, насколько требователь-
ными к ресурсам являются операции обновления данных и насколько важно
уделять внимание оптимизации в слое Power Query.
Далее мы поговорили про параллельные вычисления и научились выпол-
нять соответствующие настройки в Power BI Desktop. Заодно рассмотрели
опции, позволяющие ускорить процесс разработки решения и обновление
данных в целом. Также мы узнали, как настроить параллельные вычисления
применительно к Power BI Premium, Embedded и Azure Analysis Services.
После этого переключились на процесс преобразования данных, особо
выделив типичные операции вроде фильтрации, объединения и агрегации,
способные замедлять работу системы. Мы изучили особенности очень важ-
ной возможности свертывания запросов, позволяющей существенно уско-
рить процесс за счет переноса вычислений на сторону источника данных, где
они обычно выполняются гораздо быстрее и эффективнее. Мы узнали, как
определить в Power BI Desktop, выполняется ли свертывание запроса, а за-
одно научились настраивать добавочное обновление, призванное снизить
количество загружаемых данных.
Далее мы рассмотрели такую важную тему, как содержимое логов диаг
ностики Power Query. Мы увидели, что анализировать структуру этих логов
бывает не всегда удобно, но при этом в них содержится очень полезная ин-
формация для оптимизации запросов и источников данных.
В завершение главы мы узнали, что из себя представляют потоки данных
и как они могут быть использованы для снижения интенсивности во время
загрузки и преобразования информации путем централизации общей логи-
ки и данных. Мы отметили, что в плане оптимизации производительности
потоки данных мало отличаются от Power Query. Однако при работе с ними
мы можем воспользоваться дополнительными возможностями, такими как
расширенная подсистема вычислений.
Теперь, когда вы узнали, как наиболее эффективно доставлять данные
в Power BI, давайте рассмотрим принципы оптимизации отчетов и дашбор-
дов, чтобы пользователю было комфортнее работать, а данных загружалось
меньше.
Глава 9
Разработка отчетов
и дашбордов
Технические требования
Для некоторых примеров из этой главы мы подготовили сопроводитель-
ные материалы, на которые будем ссылаться при обсуждении тех или иных
приемов. Все нужные файлы располагаются в папке Chapter09 в хранилище
GitHub по адресу https://github.com/PacktPublishing/Microsoft-Power-BI-Perfor-
mance-Best-Practices.
Оптимизация интерактивных отчетов 167
Рис. 9.6 Левый элемент выводит все записи, а правый – только первые пять
Оптимизация интерактивных отчетов 173
тами. Для этого необходимо выделить нужный элемент или срез и нажать
на кнопку Изменить взаимодействия (Edit interactions) в меню Формат
(Format). Элемент останется выделенным, и вы сможете включить или вы-
ключить взаимодействия. В данном случае в левом визуальном элементе
взаимодействие осталось включенным, а в правом мы его выключили. За
взаимодействия отвечают иконки в правом верхнем углу элементов.
Оптимизация дашбордов
При помощи дашбордов (dashboard) в Power BI пользователи имеют возмож-
ность собрать на одной странице отчеты и визуальные элементы. Для этого
необходимо воспользоваться техникой закрепления (pinning). Это самый прос
той способ создать единое пользовательское представление, состоящее из
самых важных элементов, на основе разных – даже не связанных друг с дру-
гом – отчетов. Дашборды в Power BI работают быстро и ведут себя иначе, чем
отчеты, поскольку всегда, когда это возможно, кешируют результаты запросов
и визуальные элементы. Это позволяет значительно снизить время загрузки
дашборда за счет отсутствия необходимости выполнять множество действий
по обработке данных по требованию. Power BI отправляет запросы и подго-
тавливает плитки (tiles) дашборда после обновления исходных данных.
Оптимизация отчетов с разбивкой на страницы 177
Заключение
В этой главе мы сконцентрировали свое внимание на визуальном слое Po
wer BI, в котором проектируем наши отчеты. Мы узнали, что в Power BI сущест
вует два типа отчетов. Интерактивные отчеты содержат набор визуальных
элементов, таких как диаграммы и срезы, и они используются в большинстве
180 Разработка отчетов и дашбордов
Технические требования
Для некоторых примеров из этой главы мы подготовили сопроводитель-
ные материалы, на которые будем ссылаться при обсуждении тех или иных
приемов. Все нужные файлы располагаются в папке Chapter10 в хранилище
GitHub по адресу https://github.com/PacktPublishing/Microsoft-Power-BI-Perfor-
mance-Best-Practices.
Таблица
измерения
Таблица Таблица
измерения измерения
Таблица
фактов
Таблица Таблица
измерения измерения
Date Booked
Live
Booking
Измерение: Employee
Рис. 10.8 После добавления таблицы-моста связи обрели тип «один ко многим»
Таблица безопасности:
SEC_Gepgraphy Измерение: Geography
Таблица безопасности:
SEC_ProductGroup Измерение: ProductGroup
Измерение: Geography
Таблица фактов:
Sales
Измерение: ProductGroup
Таблица безопасности:
Измерение: Users SEC_Gepgraphy Измерение: Geography
Заключение
В этой главе мы рассмотрели различные способы повышения производи-
тельности наборов данных Power BI в режиме Import. Начали мы с неболь-
шого теоретического введения в размерное моделирование Кимбалла, из
которого узнали о схеме «звезда», строящейся на основании измерений
и таблиц фактов. Моделирование данных мы определили как метод группи-
ровки и объединения атрибутов в таблицах, а схема «звезда» представляет
собой один из способов моделирования. Создание моделей позволяет людям
без специальных знаний анализировать свои данные, интуитивно связы-
вая номинативные атрибуты из таблицы фактов с измерениями, а движок
Analysis Services, лежащий в основе Power BI, очень эффективно работает со
схемой «звезда», которая является предпочтительным выбором. В процессе
освоения моделирования данных мы перечислили четыре этапа размерно-
200 Моделирование данных и безопасность на уровне строк
Технические требования
Для этой главы мы подготовили один файл с примерами, который называ-
ется DAX Optimization.pbix и который можно найти в папке Chapter11 в хра-
202 Улучшаем DAX
YoY% VAR =
VAR __PREV_YEAR =
CALCULATE(
SUM('Fact Sale'[Total Sales]),
DATEADD('Dimension Date'[Date], -1, YEAR))
RETURN
(SUM('Fact Sale'[Total Sales]) - __PREV_YEAR) /__PREV_
YEAR
Еще одним преимуществом этого подхода является то, что вам не при-
дется беспокоиться о производительности каждый раз, когда используется
эта мера. В результате вы сможете сбалансировать быстродействие системы
в зависимости от потребностей пользователей.
Если вам все же необходимо реализовать замену пустых значений в мерах,
вы можете сделать это для определенного диапазона данных. Мы рекомен-
дуем вам ознакомиться со статьей на сайте SQLBI, в которой подробно рас-
смотрены нюансы этой задачи с использованием комбинации выражений
DAX и приемов моделирования данных в зависимости от вашего сценария:
https://www.sqlbi.com/articles/how-to-return-0-instead-of-blank-in-dax.
Также отметим, что не стоит менять пустые числовые значения на текс
товые шаблоны наподобие «Данные отсутствуют». Хотя эта информация
может оказаться полезной для пользователя, решение окажется еще более
медленным по сравнению с заменой пустых значений нулями, поскольку
мера станет текстовой. Кроме того, это может привести к проблемам в даль-
нейшем, если эта мера будет использована в других вычислениях.
Заключение
В этой главе мы узнали о важности улучшения выражений DAX, посколь-
ку неоптимально написанные формулы способны свести на нет все усилия
в области моделирования данных. Причина этого в том, что шаблоны DAX
непосредственно влияют на то, как именно Analysis Services будет извлекать
данные и проводить вычисления.
Проверку своих оптимизаций выражений, написанных на языке DAX, мы
выполняли при помощи уже знакомых вам инструментов, описанных в пре-
дыдущих главах. Сначала мы привели пример использования Best Practice
Analyzer и визуального анализа для поиска и исправления узких мест в фор-
мулах. После этого мы воспользовались Desktop Performance Analyzer для
перехвата запросов, сгенерированных визуальными элементами, после чего
запускали их при помощи DAX Studio для лучшего понимания их поведения.
В процессе анализа очень важно обращать внимание на общую длительность
выполнения запроса, количество внутренних запросов, а также время, потре-
бовавшееся движку формул и движку хранилища. После проверки внесенных
изменений в DAX Studio можно применять обновления к набору данных
и тестировать отчеты на рабочих сценариях для сравнения показателей.
214 Улучшаем DAX
Технические требования
Для этой главы мы подготовили один составной файл с примерами, который
называется Composite and Aggs.pbix. Его можно найти в папке Chapter12 в хра-
нилище GitHub по адресу https://github.com/PacktPublishing/Microsoft-Power-BI-
Performance-Best-Practices. Поскольку в этом файле используется режим Direc-
tQuery для доступа к базе данных SQL Server, мы включили в список файлов
бэкап базы с именем AdventureWorksLT2016.bak. Вы можете восстановить базу
данных из этого бэкапа в SQL Server и обновить подключение в Power BI
Desktop для успешного запуска примеров.
Масштабирование с использованием
составных моделей и агрегатов
До сих пор мы говорили, что максимальную производительность наборам
данных в Power BI обеспечивает режим хранения Import. Но иногда большие
объемы данных и связанные с этим ограничения на обновление приводят
вас к решению использовать режим DirectQuery. Здесь у вас может возник-
нуть желание перечитать главу 2, в которой мы говорили о выборе режимов
хранения и их преимуществах и недостатках.
Также мы рассказывали о способности Analysis Services очень эффективно
агрегировать данные, а в решениях из области бизнес-аналитики агрега-
ция используется большую часть времени. Применение режима DirectQuery
позволяет делегировать обязанности по агрегированию данных источнику,
чтобы избавить от этих ресурсоемких операций Power BI. Если вы работае-
те с десятками миллионов или миллиардами строк, агрегация может стать
узким местом в плане производительности системы, даже если источник
данных хорошо оптимизирован. И здесь вам могут прийти на помощь со-
ставные модели данных и агрегаты.
Использование агрегатов
В подавляющем большинстве аналитических сценариев в том или ином
виде используются агрегированные данные. Обычно принято анализировать
исторические тренды, отклонения и выбросы в обобщенном виде, после чего
при необходимости углубляться в детализацию. Давайте в качестве примера
рассмотрим работу логистической компании по отслеживанию тысяч от-
правок. Вряд ли вы можете себе представить, что базовый анализ компании
может начинаться с детализации до конкретной посылки. Скорее всего, из-
начально аналитика строится с группировкой по типу транспортировки или
региону. В случае появления цифр, не отвечающих определенным критери-
ям, можно углубиться в данные в поисках причин отклонений. В главе 9 мы
подробно говорили о таком методе анализа как одном из наиболее эффек-
тивных и удобных.
При всем этом вы можете следовать всем рекомендациям при проекти-
ровании модели, но все равно столкнуться с проблемами быстродействия
отчетов при использовании объемных наборов данных в режиме DirectQuery.
Даже с учетом проведения всех оптимизаций существует физический предел
в отношении обработки данных с использованием ограниченных ресурсов
компьютера. В таких ситуациях на помощь приходят агрегаты (aggregations),
реализованные в Power BI. Агрегатная таблица (aggregation table) представ-
ляет собой слепок сгруппированных данных из таблицы фактов, хранящийся
в памяти в режиме Import. Таким образом, содержимое этих таблиц следует
актуализировать во время обновления данных.
Давайте продолжим работать с примером, показанным на рис. 12.6, и соз-
дадим агрегат для таблицы OrderDetail во избежание выполнения внешних
запросов DirectQuery. Допустим, мы выяснили, что очень часто в наших от-
четах используются агрегированные данные о продажах на уровне товаров.
Таким образом, мы сможем значительно повысить быстродействие запросов,
если создадим соответствующую агрегатную таблицу с промежуточными
данными. Добавим таблицу с именем Agg_SalesByProduct в режиме Import
с использованием следующего запроса SQL:
SELECT
ProductID,
sum(sod.LineTotal) as TotalSales,
sum(sod.OrderQty) as TotalQuantity
FROM
[SalesLT].[SalesOrderDetail] sod
GROUP BY ProductID
Модель и обслуживание
PolyBase
Azure Synapse Azure Analysis
Analytics Services
(Synapse SQL)
Подготовка
Загрузка Хранение и обучение
Логи, файлы и медиа
(неструктурированные)
ключиться из Power BI напрямую к Azure Data Lake Storage для исследования форма-
та и качества данных. Также есть и другие компоненты Azure, дополняющие эту схему,
которые не были здесь показаны.
Заключение
В этой главе мы узнали, как справляться с действительно огромными объ-
емами данных. Сперва мы рассмотрели случаи, когда ваш набор данных
в Power BI превышает 1 Гб, допустимый при использовании общей емкости,
и порекомендовали переход на емкости Power BI Premium, ограничение в ко-
торых установлено на отметке 10 Гб. Мы также отметили, что с использова-
нием формата хранения крупных наборов данных объем ваших датасетов
может легко превышать и эти лимиты. Чисто технически вы можете задей-
ствовать всю доступную для вашей емкости память, а для плана Premium
P5 она составляет 400 Гб. Кроме того, емкости Premium предлагают расши-
ренные возможности по использованию параллелизма, что положительно
сказывается на производительности обновлений и запросов.
Заключение 235
грузки отчета для датасетов объемом более 5 Гб. И чем больше данных,
тем больше будет прирост.
Далее перечислим некоторые возможности Premium, не относящиеся на-
прямую к производительности. Заметим, что последние три пункта недо-
ступны для варианта лицензирования Premium на пользователя (Premium
Per User – PPU):
возможность создавать отчеты с разбивкой на страницы: речь
о строго форматированных отчетах на базе SQL Server Reporting Ser-
vices, оптимизированных для печати;
конечные точки XMLA: доступ к API для автоматизации и пользова-
тельской настройки развертывания/обновления;
приложение Life Cycle Management (ALM): использование конвейе
ров развертывания, управление разработкой и оценка версий в виде
приложения;
улучшенные возможности применения искусственного интеллек-
та: анализ текста и изображений, а также автоматизированные методы
машинного обучения;
межрегиональное развертывание: вы можете развертывать емкости
Premium в разных регионах с целью удовлетворения требований в от-
ношении суверенности данных (data sovereignty);
применение модели Bring Your Own Key (BYOK): вы можете исполь-
зовать собственный ключ шифрования для обеспечения безопасности
данных.
Теперь давайте посмотрим, как емкости Premium используют ресурсы
и что происходит при увеличении требований и нагрузок.
В исходной версии Premium весь объем памяти, выделенный для емкости, делил-
ся между всеми рабочими нагрузками и не мог быть превышен. К примеру, в плане
P1 все параллельные процессы в емкости не могли использовать суммарно больше
25 Гб памяти.
При переходе на Gen2 модель использования ресурсов была изменена таким образом,
чтобы тяжелые фоновые операции не мешали пользователям, отнимая все имеющие-
ся ресурсы. Теперь ограничение на память для емкости применяется с учетом набора
данных, а не ко всем нагрузкам разом. Это означает, что с планом P1 у вас может быть
несколько активных датасетов, потребляющих до 25 Гб памяти. Обратите внимание,
что доступные ядра процессора по-прежнему могут являться сдерживающим факто-
ром из-за недоступности ограниченных потоков, а это означает, что они не могут быть
назначены для обновления контейнеров обработки. Здесь на помощь может прийти
механизм автомасштабирования, о котором мы будем говорить далее в этой главе.
емкость
(не в масштабе)
Пользовательский запрос
Пользовательский запрос
Пользовательский запрос
7
Обновление B = 2 процессорные секунды на цикл вычисления
5
Обновление A = 5 процессорных секунд на цикл вычисления
0
1:00 4:00 9:00
А B C D
Время (не в масштабе)
Перегрузка
Интерактив
120
Интерактив
Интерактив
Процессорные Интерактив ОТСРОЧКА Интерактив
секунды Интерактив
Интерактив
Интерактив
Фоновые операции
0
А B
Фоновые операции
А B
"filterTable":"DimDate",
"filterColumn":"Quarter",
"isSlicer":false,
"filtersList":["Q1","Q2","Q3","Q4"]
}
],
&"thinkTimeSeconds":1
};
7. На этой диаграмме операции делятся на быстрые (Fast: < 100 мс),
приемлемые (Moderate: от 100 мс до 2 с) и медленные (Slow: > 2 с).
В идеале мы бы хотели видеть здесь как можно меньше медленных
операций, и тенденция их присутствия должна быть равномерной или
нисходящей. Если она восходящая, вам необходимо дополнительно ис-
следовать данные на предмет поиска объектов, наибольшим образом
влияющих на производительность.
Теперь, когда мы произвели обобщенный анализ производительности
системы, пришло время более детально рассмотреть объекты и операции,
ставшие причиной выделенных на рис. 13.7 областей.
Исследование перегрузки
Первое, что мы можем сделать, – это повысить гранулярность двух верхних
визуальных элементов с обзорной страницы приложения. Мы открыли от-
чет за 24 февраля из верхнего левого графика, в результате получив рас-
шифровку по часам. Одновременно с этим открывается детализированный
вид правого верхнего графика до 30-секундных интервалов, которые совпа-
дают с продолжительностью циклов вычисления, о которых мы говорили
ранее.
Детализированные диаграммы показаны на рис. 13.9. Мы изменили их
положение для большей наглядности. Также мы навели мышь на один из
высоких столбиков между 7:00 и 8:00 утра, когда в нашем распоряжении
было лишь одно виртуальное ядро. Значение этого столбика выходит за до-
пустимую границу, и мы отчетливо видим, как сильно в этот момент емкость
нуждается в дополнительных ресурсах. Также на графике хорошо видны
моменты, когда нам было выделено сначала одно дополнительное ядро, а за-
тем четыре. Заметно и то, что в результате оказания повышенных нагрузок
на емкость ближе к концу тестирования ресурсы центрального процессора
в течение короткого времени использовались более чем на 150 %.
Вы могли ожидать, что добавление одного виртуального ядра к емкости EM1 подни-
мет предельную планку использования центрального процессора до отметки 200 %.
Однако на деле одно дополнительное ядро увеличило порог до 150 %, а четыре
ядра – до 300 %. Причина в том, что ресурсы выделяемых в рамках автомасшта-
бирования ядер поровну поделены между серверными и интерфейсными опера-
циями. Таким образом, при добавлении одного ядра мы получаем прирост в 50 %
к серверной обработке, которую, как мы уже писали, и отслеживают метрики про-
изводительности.
Давайте подведем итог этого раздела, обозначив шаги, которые вам сле-
дует предпринимать при возникновении перегрузок при работе с отчетами.
1. Первым делом выделите самые объемные объекты, вносящие вклад
в перегрузку, особенно обращая внимание на те из них, которые ис-
пользуются большим количеством пользователей.
2. Проанализируйте тенденции поведения этих объектов, выяснив, какой
характер носят перегрузки – постоянный или периодический. Также
обратите внимание на то, как с течением времени меняется актив-
ность системы, количество пользователей и минут с перегрузкой. Если
вы наблюдаете постепенный рост этих показателей, скорее всего, это
говорит о естественных увеличениях потребности в ресурсах вашей
266 Оптимизация емкостей Premium и Embedded
Заключение
В этой главе мы вплотную подошли к окончанию нашего увлекательного
путешествия в мир оптимизации решений на основе Power BI. Мы подробно
поговорили о возможностях, предоставляемых емкостями Power BI Premium
и Embedded. Мы узнали, что, несмотря на необходимость приобретать эти
лицензии отдельно, их планы содержат очень много общего в отношении
функционала. Это означает, что рекомендации по оптимизации этих емко-
стей по большей мере совпадают.
Также мы ближе познакомились с типом лицензирования Power BI Premi-
um и узнали о некоторых уникальных возможностях, позволяющих повысить
производительность и реализовать масштабирование проекта. После этого
мы поговорили о втором поколении Premium (Gen2), которое в настоящее
время входит в базовое предложение Microsoft. В связи с общей доступно-
стью Gen2 мы не стали тратить время на описание предыдущего поколения
Premium и его особенностей. Затем быстро пробежались по настройкам ем-
кости, таким как тайм-ауты запросов и интервалы обновлений, с помощью
которых вы можете уменьшить влияние ресурсоемких операций на емкость.
Далее в этой главе мы обсудили разные модели оценки нагрузки на ем-
кость в Gen2 и изменения в ограничениях на использование памяти, которые
помогли повысить масштабируемость решений, особенно в отношении об-
новления данных. В частности, мы поговорили о возможности осуществлять
отсрочку запросов во время перегрузки емкости.
После этого мы продолжили разговор о перегрузках и в качестве основной
меры борьбы с истощением ресурсов посоветовали применять автомати-
Заключение 267
Пользовательское приложение
(например, портал или веб-сайт)
Служба Power BI
Встроенное содержимое
Power BI
Инициализация
Время
VisualRendered
(В)
Rendered
Рис. 14.3 Хронология событий в пользовательском приложении
Заключение
В этой главе мы поговорили об оптимизации процесса встраивания содер-
жимого Power BI в сторонние приложения. Мы узнали, что емкости Premium
и Embedded позволяют разработчикам без каких-либо серьезных усилий
внедрять свои отчеты в пользовательские приложения. Это дает возмож-
ность расширить спектр контента приложения за счет аналитических от-
четов Power BI. При этом пользователям не нужно взаимодействовать непо-
средственно с Power BI, доступ к необходимым отчетам у них будет прямо
из приложения. Мы на протяжении всей книги говорили о том, как важно
планировать и оптимизировать емкости, в том числе Embedded, и находя-
щееся в них содержимое.
Также в этой главе мы узнали о том, что процесс встраивания контента
включает в себя коммуникацию между службой Power BI и приложением
посредством вызовов API. Инструментарий емкости Embedded позволяет
разработчикам осуществлять аутентификацию в Power BI, загружать базовый
код приложения и размещать в нем отчеты, дашборды и плитки. Это ведет
к появлению накладных расходов на внедрение, которые могут быть очень
большими в случае существенных задержек в коммуникации между прило-
жением и Power BI. В то же время вы можете и должны проводить оптимиза-
цию содержимого Power BI отдельно от механизмов встраивания. В идеале
вы уже должны были это сделать, чтобы полностью сконцентрироваться на
настройке производительности.
Кроме того, мы поговорили о важности использования последних версий
инструментов при выполнении встраивания контента в приложение с целью
276 Встраивание в приложения
Послесловие
Поздравляем! Наше путешествие в мир оптимизации Power BI подошло к ло-
гическому завершению, и теперь вы должны быть готовы применить все по-
лученные знания и навыки на практике. А завершить хочется напоминанием
о том, что управление производительностью должно стать неотъемлемой
частью каждого процесса в жизненном цикле ваших решений. И наилуч-
ших результатов вы сможете добиться только при планировании и тесном
сотрудничестве со всеми специалистами, способными внести свой вклад
в оптимизацию ваших проектов!
Предметный указатель
A customLayout, 273
AAS, 82, 218
ADLS, 233 D
ADLS Gen2, 233 Data mart, 37
Advanced Scripting, 114 Data warehouse, 37
Apache Spark, 234 DAX, 178
Azure Analysis Services, 82, 218 DAX Studio, 118
Azure Data Lake, 160 DIVIDE(), 205
Azure Data Lake Storage, 233
Azure ExpressRoute, 51
Azure Log Analytics, 81 E
Azure Synapse, 233 ELT, 231
EmbedURL, 271
B ETL, 231
Extract-Load-Transform, 231
Best Practice Analyzer, 113 Extract-Transform-Load, 231
BI-система самообслуживания, 135
BLANK(), 211
bookmarks, 271 F
Bring Your Own Key, 240 FILTER(), 210, 211
filters, 271
C FIND(), 210
CALCULATE(), 190, 210
CALCULATETABLE(), 210 G
Cardinality, 36 GroupKind.Local, 151
CI/CD, 38 GUID, 192
COMBINEVALUES(), 58
Composite model, 38
CONTAINS(), 211
H
COUNT(), 211 Hadoop Distributed File System, 233
COUNTROWS(), 211 HASONEVALUE(), 209
CPUUtilizationPercentageThreshold, 50 Home region, 33
Current User Sessions, 82 Hop, 28, 41
278 Предметный указатель
I Premier Support, 46
Premium на пользователя, 240
iFrame, 271 Premium Capacity Utilization and
INNER JOIN, 57 Metrics, 254
INTERSECT(), 211
ISBLANK(), 211
Q
L QPU, 82
QSO, 218
layoutType, 273
QueryAggregationTimeInMinutes, 45
List, 148
QueryExecutionAggregationReport, 44
List.Buffer(), 148
QueryExecutionAggregationTimeIn
Loaded, 274
Minutes, 44
LoadTestingPowerShellTool, 251
QueryExecutionReport, 44
LOOKUPVALUE(), 196
Query Pool Busy Threads, 83
Query Processing Units, 82
M Query Scale Out, 218
Mashup engine, 27, 40 QueryStartReport, 44
MaxParallelism, 221
MDX, 178 R
Memory, 82
RangeEnd, 152
MemoryUtilizationPercentageThreshold, 50
RangeStart, 152
M Engine Memory, 82
RDL, 177
M Engine QPU, 82
RealisticLoadTestTool, 251
MPP, 231
RELATED(), 100
Remove-OnPremisesDataGateway, 49
N Rendered, 274
Network latency, 28 ReplicaSyncMode, 222
Report Definition Language, 177
ReportFileCount, 44
O ReportFilePath, 44
OUTER JOIN, 57 ReportFileSizeInBytes, 44
ResourceUtilizationAggregationPeriodIn
Minutes, 50
P RLS, 194
P90, 25
Parquet, 231
Partition Manager, 221
S
Path, 195 SEARCH(), 210
PBIE, 82, 84 SELECTEDVALUE(), 209
Performance Analyzer, 86 sequence, 144
Permissions, 271 SKU, 249
ping, 28 Slicers, 271
powerbi.bootstrap, 271 SMP, 230
powerbi.embed, 271 Spark Jobs, 234
Power BI Embedded, 82, 84 SQL Server Management Studio, 221
Power BI Helper, 110 SQL Server Profiler, 120
powerbi.preload, 270 SQL Server Reporting Services, 177
Power BI Report Builder, 178 Storage mode, 32
Power BI service, 29 SUMMARIZE(), 210
Power Query, 142 SUMMARIZECOLUMNS(), 210
Power Query Online, 161 Synapse Studio, 233
Предметный указатель 279
Г
U
Гибридная архитектура хранилища
Unified Support, 46 данных, 232
Глобальный уникальный
V идентификатор, 59, 192
Горизонтальное масштабирование
VALUES(), 209
запросов, 218
VAR, 204
V-core, 240
VertiPaq, 34, 118 Д
VertiPaq Analyzer, 118 Дашборд, 176
View Metrics, 118 Движок обработки, 27, 40
VisualRendered, 274 Движок обработки Power Query, 143
visualRenderedEvents, 274
Движок формул, 30, 122
Visual Studio, 221
Движок хранилища, 30, 122
Двунаправленная связь, 59, 112, 193
X Денормализация, 185
xVelocity, 34 Денормализованная таблица, 185
Дерево декомпозиции, 157
Диагностика запроса, 154
А Динамические административные
Автомасштабирование, 246 представления, 118
Автоматические агрегаты, 230 Динамический RLS, 194
Автоматическое обновление страниц, 43 Добавочное обновление, 152
Агрегат, 226 Домашний регион, 33
Агрегатная таблица, 226
Анализатор производительности, 86 Е
Единица
Б обработки запросов, 82
Базовая мера, 112 хранения, 249
Безопасность на уровне строк, 194 Единственный источник истины, 37
Бессерверный пул, 233 Емкость Premium, 217
Большие данные, 231
Брандмауэр, 41 Ж
Журнал
В аудита, 80
Ведение логов, 43 действий, 80
280 Предметный указатель
З Н
Зависимости в мерах, 112 Направление кросс-фильтрации, 59
Загрузка фоновых данных, 145 Неиспользуемое поле, 111
Закрепление, 176 Нормализация, 183
И О
Иерархия типа родитель–потомок, 195 Облачная реплика, 51
Измерение, 56, 184 Общая емкость, 216
Имя участника-пользователя, 72 Общие наборы данных, 27
Индекс, 57 Ограничение, 57
Интерактивный отчет, 167 Ограниченные связи, 225
Интернет вещей, 215, 231 Озеро данных, 232
Интерфейсные ядра, 243 Оптимизация запросов DAX, 202
Отчет с разбивкой на страницы, 167, 177
К
Карточка, 170
П
Классическая рабочая область, 66 Параметризация, 179
Кодирование Параметры запросов, 145
на основе длин серий, 193 Первичный ключ, 57
на основе значений, 193 Перегрузка, 245
со словарем, 193 Перекрестное произведение, 197
Колоночное хранилище, 34 Платформа как услуга, 218, 266
Конвейер, 232 Подсказки, 151
Конечная точка XMLA, 81, 144 Пользовательские оповещения, 253
Контейнер вычисления, 143 Портал AppSource, 254
Контекст строки, 100 Поток данных, 160
Контрольные ожидаемые Приемлемое время ожидания, 24
показатели, 130 Процентиль, 25
Кратность, 36, 59, 191 Процессорное время, 243
Процессорные секунды, 243
Прыжки, 28
Л Прыжок, 41
Локальный шлюз данных, 39 Пул Spark, 234
М Р
Максимальное состояние процессора, 96 Рабочая область второй версии, 66
Массово-параллельная обработка, 231 Размерная модель, 184
Масштабирование, 48 Размерное моделирование, 164, 183
Материализованное представление, 63 Ранжирующие функции, 173
Мера области запроса, 123 Распорядитель данных, 137
Метрики использования, 66 Распределение ресурсов, 43
Многострочная карточка, 170 Расширенное ядро вычислений, 162, 239
Моделирование данных, 54 Расширенный редактор, 146
Модель Редактор Power Query, 54
данных, 54 Режим
лицензирования, 249 ограничения количества запросов, 245
с активным источником данных, 136 отсрочки, 245
с пассивным источником данных, 135 отсрочки интерактивных запросов, 245
Мощность, 191 синхронизации, 222
Мусорное измерение, 197 хранения, 32
Предметный указатель 281
Таблица, 170
безопасности, 194 Э
отслеживания, 221 Эксклюзивная длительность, 157
фактов, 184
Таблица-мост, 189
Табличная объектная модель, 221
Я
Токены внедрения, 268 Язык M, 142
Книги издательства «ДМК ПРЕСС»
можно купить оптом и в розницу
в книготорговой компании «Галактика»
(представляет интересы издательств
«ДМК ПРЕСС», «СОЛОН ПРЕСС», «КТК Галактика»).
Адрес: г. Москва, пр. Андропова, 38, оф. 10;
тел.: (499) 782-38-89, электронная почта: books@alians-kniga.ru.
При оформлении заказа следует указать адрес (полностью),
по которому должны быть высланы книги;
фамилию, имя и отчество получателя.
Желательно также указать свой телефон и электронный адрес.
Эти книги вы можете заказать и в интернет-магазине: http://www.galaktika-dmk.com/.
Бхавик Мерчант