Для создания проекта Integration Services, как демонстрируется в лекции, после установки Visual Studio 2019 Community Edition надо:
1. скачать пакет sql server integration services
2. следовать одношаговой инструкции по ссылке:
Подготовка проекта ETL
Продолжаем создание ETL-процедуры (Extract, Transform, Load — извлечение, преобразование, загрузка), которая загружает информацию в хранилище данных (Data Warehouse). В таблице продаж есть поле с датой и временем, поэтому для соответствующего поля выбираем тип datetime. Для количества заранее задаём float, чтобы хранить дробные значения и избежать конфликта типов.
Microsoft предлагает комплексное решение: SQL Server может быть и OLTP-источником (Online Transaction Processing — оперативная обработка транзакций), и OLAP-решением (Online Analytical Processing — аналитическая обработка). В примере база-источник и хранилище находятся на одном сервере. На практике их часто разносят по разным серверам из-за нагрузки, безопасности и конфликтов доступа.
Код и объекты удобно создавать в Visual Studio. Компонент SQL Server Data Tools (SSDT) входит в Visual Studio начиная с 2019; в версии 2017 его нужно устанавливать отдельно. Создаём проект: File → New Project → Business Intelligence → Integration Services Project. Analysis Services нужен для аналитики и OLAP-кубов, Reporting Services — для отчётов, а нам нужен Integration Services для ETL.
Верхнеуровневый план
В проекте создаём задачу выполнения SQL и четыре потока данных:
- очистка;
- загрузка сотрудников;
- загрузка товаров;
- загрузка адресов;
- загрузка фактов.
Сначала выполняется очистка. Затем загружаются измерения сотрудников, товаров и адресов. Эти три измерения независимы, поэтому их загрузка может идти параллельно. Загрузка фактов начинается только после завершения всех трёх, потому что первичный ключ фактов состоит из ключей измерений.
В промышленных системах обычно не очищают всё хранилище и не записывают данные заново. Отслеживают изменения: неизменённые строки не трогают, изменённые обновляют, новые добавляют. Это сложная логика, требующая контроля типов и согласованности. В учебном примере используется более простой подход: полная очистка и повторная загрузка всех данных.
Очистка
Используем Execute SQL Task (задача выполнения SQL). В ней указываем SQL-запрос на удаление. Сначала очищаем Fact Sales, потому что она связана с измерениями. Затем очищаем DimAddress, DimEmployee и DimProduct. После этого хранилище пусто. Опцию подготовки запроса ставим в False: для удаления предварительная подготовка не нужна.
Загрузка сотрудников
Создаём Data Flow Task (поток данных). Источник — база AdventureWorks 2017, назначение — хранилище DV-demo. Подключение: сервер localhost, авторизация Windows. Проверяем соединение.
Источник данных — SQL Command с запросом по сотрудникам. Проверяем запрос и превью. Назначение — таблица DimEmployee. Проверку ограничений отключаем, чтобы не тратить ресурсы. Сопоставляем поля.
Возникает проблема: в источнике есть Gender, но в DimEmployee не было поля пола. Добавляем в DimEmployee столбец Gender типа nchar(1), как в источнике. Затем снова сопоставляем.
Вторая проблема: FullName в цели имел nvarchar(50), а источник может дать до 150 символов: FirstName, MiddleName, LastName — по nvarchar(50) каждый. Увеличиваем FullName до 150, затем до 200, чтобы гарантированно вместить худший случай. После обновления метаданных повторяем сопоставление. Теперь поля совпадают.
Загрузка товаров и адресов
Товары: источник — Product DB, назначение — DimProduct. Выбираем SQL-команду, проверяем превью, отключаем проверку ограничений, сопоставляем поля один к одному.
Адреса: источник — база с адресами, назначение — DimAddress. Используем SQL-запрос с адресами вплоть до города. Проверяем, отключаем проверку ограничений, выполняем полное сопоставление полей.
Переход к загрузке фактов
После очистки и загрузки трёх измерений остаётся загрузить факты продаж. Их нужно связать с уже загруженными измерениями. После настройки этого шага ETL-процедуру можно выполнить и увидеть автоматическое заполнение хранилища.
Краткие итоги
Практическая ценность материала раскрывается через последовательность решений: от выбора инструментальной среды к проектированию конвейера и далее к настройке отдельных преобразований. Такой порядок отражает главный принцип — сначала определяются зависимости между данными, а затем под них подбираются технические шаги. Центральная идея состоит в том, что загрузка хранилища управляется не произвольным набором задач, а логикой ссылочной целостности и готовности ключей. Поэтому очистка и загрузка измерений рассматриваются как подготовительный контур, а работа с фактами — как завершающий этап, который нельзя выполнить раньше.
Отдельного внимания заслуживает выбор между промышленной и учебной стратегиями. В реальной среде стремятся минимизировать объём операций: сравнивают состояния, обновляют только изменённые записи и добавляют новые. Это снижает нагрузку, но требует развитой логики контроля. Упрощённый вариант с полной перезагрузкой удобен для освоения, однако он менее эффективен и не подходит для больших систем без дополнительных оговорок. Такой контраст помогает увидеть, что ETL — это не только техническая настройка, но и компромисс между надёжностью, скоростью и сложностью сопровождения.
Не менее важен практический аспект согласования схем. Даже при внешне прямом переносе данных возникают несоответствия: отсутствующие поля, короткие типы, различия в длине строк. Их выявление на этапе сопоставления предотвращает ошибки загрузки. Изменение структуры целевой таблицы требует обновления метаданных и повторной проверки соответствия. Это показывает, что ETL-процедура должна проектироваться с запасом и проверяться до запуска. В результате формируется понимание, как из разрозненных задач строится управляемый процесс автоматического заполнения хранилища.
Создаётся ETL-процедура (Extract, Transform, Load — извлечение, преобразование, загрузка) для загрузки данных в хранилище. Для даты и времени используется datetime, для количества — float, чтобы хранить дробные значения.
SQL Server может быть и OLTP-источником, и OLAP-решением. В учебном примере источник и хранилище находятся на одном сервере. На практике их разносят из-за нагрузки и безопасности.
Проект создаётся в Visual Studio. Компонент SQL Server Data Tools (SSDT) входит в Visual Studio 2019, а для 2017 его устанавливают отдельно. Нужный проект — Integration Services Project. Analysis Services служит для аналитики и OLAP-кубов, Reporting Services — для отчётов.
Верхнеуровневый план включает:
- очистку;
- загрузку сотрудников;
- загрузку товаров;
- загрузку адресов;
- загрузку фактов.
Сначала выполняется очистка. Затем три измерения загружаются параллельно, потому что они независимы. Факты загружаются последними: их первичный ключ состоит из ключей измерений. В промышленных системах обычно отслеживают изменения и обновляют только нужные строки. В учебном примере всё очищается и записывается заново.
Очистка выполняется через Execute SQL Task. Сначала удаляются данные из Fact Sales, затем из DimAddress, DimEmployee, DimProduct. После этого хранилище пусто. Опция подготовки запроса не используется.
Загрузка сотрудников идёт через Data Flow Task. Источник — AdventureWorks 2017, назначение — DV-demo. Подключение: localhost, авторизация Windows. Для извлечения данных используется SQL Command. В назначении выбирается таблица DimEmployee, проверка ограничений отключается, выполняется сопоставление полей.
При загрузке сотрудников выявляются две проблемы. В целевой таблице нет поля Gender; его добавляют с типом nchar(1), как в источнике. Поле FullName сначала имеет длину 50, но источник может дать до 150 символов, поэтому длину увеличивают до 150, затем до 200. После изменения структуры нужно обновить метаданные и сопоставление.
Товары загружаются аналогично: источник — Product DB, назначение — DimProduct. Адреса загружаются в DimAddress с помощью SQL-запроса вплоть до города. Проверка ограничений отключается, поля сопоставляются один к одному.
Последний шаг — загрузка фактов продаж. Их нужно связать с уже загруженными измерениями. После настройки ETL-процедуру можно выполнить, и хранилище заполнится автоматически.
1. ETL-процедура автоматизирует загрузку данных из источника в хранилище.
2. SQL Server может поддерживать и OLTP-, и OLAP-задачи.
3. Для учебного примера достаточно Visual Studio и SSDT.
4. План загрузки строится по зависимостям: очистка, измерения, факты.
5. Три независимых измерения можно загружать параллельно.
6. Факты загружаются только после измерений из-за составного ключа.
7. В промышленных системах применяют инкрементальную загрузку.
8. Полная перезагрузка проще, но менее эффективна.
9. Сопоставление полей требует совпадения типов и длины.
10. Несоответствия схемы выявляются при настройке Data Flow.
11. Изменения структуры требуют обновления метаданных.
12. После настройки всех шагов ETL-процедуру можно выполнить.
1. Почему перед загрузкой измерений и фактов в учебном примере выполняется полная очистка хранилища?
2. Чем промышленный подход с отслеживанием изменений отличается от полной перезагрузки?
3. Почему загрузка сотрудников, товаров и адресов может идти параллельно?
4. Почему загрузка фактов должна начинаться только после завершения загрузки всех измерений?
5. Какую роль играет SQL Server Data Tools в Visual Studio?
6. Чем отличается проект Integration Services от Analysis Services и Reporting Services?
7. Зачем для количества использовать тип float?
8. Почему для поля с датой и временем выбирается datetime?
9. Какие подключения нужно создать для источника и назначения?
10. Зачем отключается проверка ограничений при загрузке в хранилище?
11. Какие несоответствия схемы выявились при загрузке сотрудников и как они исправлены?
12. Почему после изменения структуры таблицы нужно обновлять метаданные и сопоставление полей?