Фон
Мои первоначальные задержки рейсов американских авиаперевозчиков, ежемесячный набор данных для Windows Azure Marketplace DataMarket были предназначены для включения отдельных таблиц для каждого месяца с 1987 по 2012 годы (и более поздние версии). Я планировал сравнить производительность наборов данных и хранилища BLOB-объектов Windows Azure на постоянной основе. источники данных для таблиц Apache Hive, созданные с помощью новой функции Apache Hadoop в Windows Azure. Я использовал кодовое имя Microsoft «Передача данных» для создания первых двух из этих таблиц SQL Azure, On_Time_Performance_2012_1 и On_Time_Performance_2012_2, из соответствующих файлов Excel On_Time_Performance_2012_1.csv и On_Time_Performance_2012_2.csv в начале мая 2012 года.
Впоследствии я обнаружил, что на портале публикации Windows Azure возникают проблемы с загрузкой больших (~ 500 000 строк, ~ 15 МБ) файлов On_Time_Performance_ YYYY _ MM .csv. Менеджер групповых программ Microsoft для DataMarket сообщил мне, что функция загрузки * .csv будет отключена для «предотвращения путаницы». Для получения дополнительной информации об этой проблеме см. Мои предварительные просмотры под кодовым названием Microsoft «Передача данных» и «Хаб данных» .
Еще одним осложнением стало подозрение, что редактирование текущего источника данных для включения каждой дополнительной таблицы потребует проверки со стороны разработчика DataMarket. Раннее редактирование одного символа в поле описания привело к тому, что мой набор данных был недоступен в течение нескольких дней.
Обходной путь для решения двух предыдущих проблем — создать локальный клон таблицы SQL Azure со столбцом идентификаторов RowID и заново создать таблицу SQL Azure без свойства идентификатора в столбце RowID . Это позволяет использовать инструкцию BULK INSERT, чтобы импортировать новые строки из файлов On_Time_Peformance_ YYYY_MM .csv в локальную таблицу SQL Server 2012, а затем использовать мастер миграции SQL Azure (SQLMW) Джорджа Хьюи v3.8.7 или новее для добавления новых данных в один файл On_Time_Performance Таблица SQL Azure. Управление значениями идентификаторов первичного ключа в локальной таблице SQL Server безопаснее и проще, чем в SQL Azure.
Недостатком этого решения является то, что для поддержания доступа к веб-базе данных SQL Azure объемом 1 ГБ потребуется 9,99 долл. США в месяц после истечения срока действия бесплатной пробной версии. Microsoft предоставляет бесплатное хранилище SQL Azure при указании новой базы данных на портале публикации Windows Azure Marketplace.
В этом посте описан процесс и инструкции T-SQL для создания и управления локальными базами данных SQL Server [Express] 2012, а также для постепенной загрузки новых данных в базу данных SQL Azure.
Создание таблицы SQL Azure On_Time_Performance
Если у вас нет подписки SQL Azure, подпишитесь на трехмесячную бесплатную пробную версию Windows Azure , которая включает веб-базу данных SQL Azure объемом 1 ГБ, и используйте портал управления Windows Azure для создания экземпляра сервера SQL Azure и Портал управления SQL Azure для добавления базы данных (с именем On_Time_Performance для этого примера.)
Совет . Преобразуйте подписку в платную подписку до истечения срока действия бесплатной пробной версии, если вы хотите сохранить доступ к базам данных экземпляра.
Ниже приведен сценарий T-SQL, сгенерированный SQL Server Management Studio 2012 для одной таблицы On_Time_Performance с параметром «Включить индексы», для которого установлено значение «истина», а для всех полей указано значение «НЕ НУЛЬ» :
/****** Object: Table [dbo].[On_Time_Performance] ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[On_Time_Performance]( [RowId] [bigint] NOT NULL, [Year] [int] NOT NULL, [Month] [int] NOT NULL, [DayofMonth] [int] NOT NULL, [FlightDate] [datetime] NOT NULL, [Carrier] [nvarchar](256) NOT NULL, [Origin] [nvarchar](256) NOT NULL, [Dest] [nvarchar](256) NOT NULL, [DepDelayMinutes] [int] NOT NULL, [ArrDelayMinutes] [int] NOT NULL, PRIMARY KEY CLUSTERED ( [RowId] ASC )WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF) ) GO /****** Object: Index [IX_ArrDelayMinutes] ******/ CREATE NONCLUSTERED INDEX [IX_ArrDelayMinutes] ON [dbo].[On_Time_Performance] ( [ArrDelayMinutes] ASC )WITH (STATISTICS_NORECOMPUTE = OFF, DROP_EXISTING = OFF, ONLINE = OFF) GO SET ANSI_PADDING ON GO /****** Object: Index [IX_Carrier] ******/ CREATE NONCLUSTERED INDEX [IX_Carrier] ON [dbo].[On_Time_Performance] ( [Carrier] ASC )WITH (STATISTICS_NORECOMPUTE = OFF, DROP_EXISTING = OFF, ONLINE = OFF) GO /****** Object: Index [IX_DepDelayMinutes] ******/ CREATE NONCLUSTERED INDEX [IX_DepDelayMinutes] ON [dbo].[On_Time_Performance] ( [DepDelayMinutes] ASC )WITH (STATISTICS_NORECOMPUTE = OFF, DROP_EXISTING = OFF, ONLINE = OFF) GO SET ANSI_PADDING ON GO /****** Object: Index [IX_Dest] ******/ CREATE NONCLUSTERED INDEX [IX_Dest] ON [dbo].[On_Time_Performance] ( [Dest] ASC )WITH (STATISTICS_NORECOMPUTE = OFF, DROP_EXISTING = OFF, ONLINE = OFF) GO /****** Object: Index [IX_FlightDate] ******/ CREATE NONCLUSTERED INDEX [IX_FlightDate] ON [dbo].[On_Time_Performance] ( [FlightDate] ASC )WITH (STATISTICS_NORECOMPUTE = OFF, DROP_EXISTING = OFF, ONLINE = OFF) GO /****** Object: Index [IX_Month] ******/ CREATE NONCLUSTERED INDEX [IX_Month] ON [dbo].[On_Time_Performance] ( [Month] ASC )WITH (STATISTICS_NORECOMPUTE = OFF, DROP_EXISTING = OFF, ONLINE = OFF) GO /****** Object: Index [IX_Origin] ******/ CREATE NONCLUSTERED INDEX [IX_Origin] ON [dbo].[On_Time_Performance] ( [Origin] ASC )WITH (STATISTICS_NORECOMPUTE = OFF, DROP_EXISTING = OFF, ONLINE = OFF) GO /****** Object: Index [IX_Year] ******/ CREATE NONCLUSTERED INDEX [IX_Year] ON [dbo].[On_Time_Performance] ( [Year] ASC )WITH (STATISTICS_NORECOMPUTE = OFF, DROP_EXISTING = OFF, ONLINE = OFF) GO
Примечание . SQL Azure требует, чтобы все таблицы имели кластерный первичный ключ; столбец идентификаторов RowKey такой же, как и для схемы, которая создается, если указать новую таблицу при добавлении строк из файлов * .csv с кодовым именем «Передача данных» или «Концентратор данных», а также текущий импорт DataMarket из *. функция файла CSV. Индексы необходимы для каждого поля набора данных, который вы указываете как запрашиваемый.
Откройте SQL Azure Management Studio [Express] 2012, войдите на сервер SQL Azure ( e3895m7bbt.database.windows.net для этого примера), введите свой административный идентификатор пользователя (с добавлением @ и идентификатора сервера ) и пароль:
Соединитесь, чтобы открыть соединение, нажмите Новый запрос, чтобы добавить пустое окно редактора запросов, скопируйте и вставьте предыдущую инструкцию T-SQL DDL в окно и нажмите Выполнить, чтобы создать новую таблицу и ее индексы:
Создание локальной таблицы клонирования SQL Server
Локальная таблица клонов нуждается в первичном ключе RowID со свойством identity, но не требует индексов. Подключитесь к локальному экземпляру SQL Server [Express] 2012, добавьте новую базу данных (для этого примера On_Time_Performance), откройте новое окно запроса и вставьте в него следующий код:
/****** Object: Table [dbo].[On_Time_Performance] ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[On_Time_Performance]( [RowId] [bigint] identity NOT NULL, [Year] [int] NOT NULL, [Month] [int] NOT NULL, [DayofMonth] [int] NOT NULL, [FlightDate] [datetime] NOT NULL, [Carrier] [nvarchar](256) NOT NULL, [Origin] [nvarchar](256) NOT NULL, [Dest] [nvarchar](256) NOT NULL, [DepDelayMinutes] [int] NOT NULL, [ArrDelayMinutes] [int] NOT NULL, PRIMARY KEY CLUSTERED ( [RowId] ASC )WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF) ) GO
Выполните запрос и разверните узел Таблицы, чтобы проверить его схему:
Импорт данных * .csv с помощью команды BULK IMPORT
Утилита массового копирования (bcp) в SQL Server является наиболее распространенным методом переноса данных из файлов * .csv, а также между таблицами SQL Server в глобальных сетях. Однако синтаксис командной строки bcp несколько запутан, и сегодняшние администраторы баз данных SQL Server и разработчики обычно предпочитают операторы T-SQL DDL и DML, выполняемые из графических интерфейсов.
Ниже приводится инструкция T-SQL DML, в которой используется инструкция BULK IMPORT.
USE [On_Time_Performance] GO CREATE TABLE dbo.[FlightDataTemp]( [Year] [int] NOT NULL, [Month] [int] NOT NULL, [DayofMonth] [int] NOT NULL, [FlightDate] [datetime] NOT NULL, [Carrier] [nvarchar](256) NOT NULL, [Origin] [nvarchar](256) NOT NULL, [Dest] [nvarchar](256) NOT NULL, [DepDelayMinutes] [int] NOT NULL, [ArrDelayMinutes] [int] NOT NULL) GO BULK INSERT dbo.[FlightDataTemp] FROM 'C:\Users\Administrator\Documents\FlightData\On_Time_Performance_2012_1.csv' WITH ( FIELDTERMINATOR =',', FIRSTROW = 2 ) GO INSERT INTO dbo.[On_Time_Performance] ( [Year], [Month], [DayofMonth], [FlightDate], [Carrier], [Origin], [Dest], [DepDelayMinutes], [ArrDelayMinutes]) SELECT [Year], [Month], [DayofMonth], [FlightDate], [Carrier], [Origin], [Dest], [DepDelayMinutes], [ArrDelayMinutes] FROM dbo.[FlightDataTemp] GO DROP TABLE [FlightDataTemp] GO
Примечание . Параметр FIRSTROW = 2 пропускает первую строку, содержащую имена столбцов.
Использование промежуточной временной таблицы устраняет необходимость в файле формата bcp, чтобы предотвратить сопоставление столбца идентификатора RowID с полем в файле * .csv. Он также позволяет вставлять строки из нескольких файлов * .csv и выгружать коллективные строки в одной операции SQLAzureMW.
Выберите локальный экземпляр SQL Server в обозревателе объектов, создайте новое окно редактора запросов, скопируйте и вставьте в него предыдущие операторы T-SQL, измените путь и имя файла в соответствии с расположением и именем вашего * .csv-файла и нажмите Выполните, чтобы выполнить запрос:
Примечание. Для добавления примерно 500 000 строк на моем тестовом компьютере потребовалось около 10 секунд.
Проверьте добавленные строки из числа строк Excel; ряды пострадавшего счетчик должен быть один меньше , чем количество строк рабочего листа:
Выполните запрос SELECT TOP (12) * FROM dbo.On_Time_Performance ORDER BY RowId DESC и сравните набор результатов с последними 12 строками рабочей таблицы Excel:
Добавьте строки из одного или нескольких дополнительных файлов * .csv. Добавление строк из On_Time_Performance_2012_2.csv доводит общее количество строк до чуть менее миллиона строк.
Загрузка данных в таблицу SQL Azure с помощью SQL Azure MW
Загрузите, установите последнюю версию SQL Azure MW (v3.8.7 от 24.04.2012, когда была написана эта публикация), откройте SQLAzureMW.exe.config в Блокноте или Visual Studio, найдите ScriptTableAndOrData и измените значение ScriptOptionsTableSchemaData на ScriptOptionsTableData :
Сохраните изменения, запустите SQLAzureMW.exe из папки C: \ Program Files (x86) \ SQLAzureMW и выберите параметр базы данных SQL:
Нажмите кнопку «Далее», чтобы открыть диалоговое окно «Подключение к серверу», выберите локальный экземпляр в списке «Имя сервера» и примите параметр «Основная база данных» по умолчанию:
Нажмите «Подключить», выберите базу данных On_Time_Performance в списке и нажмите «Далее», чтобы открыть страницу «Выбор объектов». Примите параметр «Сценарий для всех объектов базы данных» по умолчанию и нажмите кнопку «Дополнительно», чтобы подтвердить выбор «Только данные», указанный в файле конфигурации:
Нажмите «ОК» и «Далее», чтобы просмотреть сводку мастера сценариев, а затем нажмите «Далее» и «Да», когда вас спросят, готовы ли вы создать сценарий SQL для копирования данных из таблицы в локальный файл * .csv:
Примечание . Написание 950 959 строк таблицы заняло около 4,2 секунды.
Полная команда bcp.exe:
bcp.exe «[On_Time_Performance]. [dbo]. [On_Time_Performance]» out «c: \ SQLAzureMW \ BCPData \ dbo.On_Time_Performance.dat» -E -n -T -S OL-WIN7PRO23 \ SQLEXPRESS
Нажмите кнопку «Далее», чтобы открыть диалоговое окно «Подключение к серверу» для базы данных SQL Azure, введите имя сервера, свое имя пользователя с суффиксом @ servername и пароль, примите параметр «Основная БД» по умолчанию:
Нажмите «Подключиться», чтобы открыть страницу «Настройка подключения к целевому серверу», выберите «On_Time_Performance», нажмите «Далее» и нажмите «Да», когда вас спросят, хотите ли вы выполнить сценарий на конечном сервере, чтобы начать процесс загрузки данных. Щелкните вкладку «Производительность On_Time», чтобы отобразить ход загрузки:
Полная команда bcp для загрузки данных в пакетах по 10 000 строк:
bcp.exe «On_Time_Performance.dbo.On_Time_Performance» в «c: \ SQLAzureMW \ BCPData \ dbo.On_Time_Performance.dat» -E -n -b 10000 -a 16384 -q -S e3895m7bbt.database.wog.net -U @ e3895m7bbt «-P xxxxxx
Вот окончательный отчет о загрузке:
… Продолжение следует сегодня вечером или завтра утром.