Самый быстрый способ очистить / скопировать данные таблицы хранилища Azure в SQL Azure?

У меня есть рабочие роли, которые собирают входящие данные и хранят итоги в таблицах хранилища Azure. Мне нужно, чтобы эти данные были очищены / скопированы (через указанный интервал) в SQL Server для создания отчетов. Я беру около 1000 строк для очистки за один раз. Простой цикл с выбором / вставкой / обновлением займет много времени.

Есть идеи, как сделать это наиболее эффективно? Спасибо!


person enlightenedOne    schedule 06.03.2013    source источник
comment
Когда вы говорите «очистить», вы имеете в виду удаленное? Потому что ваш вопрос не имеет смысла, если вы хотите что-то удалить из ATS в SQL   -  person Igorek    schedule 06.03.2013
comment
Извините, я имел в виду скопировать с последними данными для отчетности :)   -  person enlightenedOne    schedule 06.03.2013
comment
@Igorek - вы придумали решение?   -  person enlightenedOne    schedule 07.03.2013


Ответы (4)


Все ли данные в четко определенных разделах? Например, 1000 объектов в ключе раздела «A» и 1000 в ключе раздела «B». Если да, то вы сможете выбрать все записи из определенного раздела. В зависимости от количества записей вам, возможно, придется иметь дело с токенами продолжения (вы можете получить только максимальное количество за запрос и использовать токен продолжения для получения оставшихся записей).

Использование ключа раздела также может быть хорошим способом обновления пакета (в транзакции).

person mcollier    schedule 06.03.2013
comment
Да, данные хорошо разделены, и я знал, что эта часть будет быстрой, но как насчет отдельных транзакций в базе данных SQL? По одному на ряд в петле было бы не очень оптимально. Мысли? - person enlightenedOne; 06.03.2013
comment
Вы можете использовать хранимую процедуру, которая принимает параметр значения таблицы. Это будет один вызов базы данных и, возможно, одна вставка на пакет. msdn.microsoft. ru / en-us / library / bb510489.aspx - person knightpfhor; 07.03.2013
comment
@knightpfhor - спасибо за предложение, я исследую этот маршрут! - person enlightenedOne; 07.03.2013

Вы можете попробовать загрузить все данные локально, а затем вставить их в SQL.

Как я могу создать резервную копию своего хранилища таблиц Windows Azure? < / а>

person dqm    schedule 06.03.2013

Я искал подобное решение более месяца назад и обнаружил, что самым быстрым способом было использовать мой собственный код - чтение из хранилища таблиц партиями и вставка в sql. Одна вещь, которая была полезна, заключалась в том, чтобы временно записать PartitionKey + RowKey в таблицу импорта sql, чтобы, когда мой импорт не удался, я мог безопасно перезапустить его с последней успешной позиции.

RedGate и другие имеют инструменты, позволяющие получить все данные из хранилища таблиц, но, насколько мне известно, они выгружают их в файлы, а не в SQL.

person Slav    schedule 06.03.2013
comment
здесь есть несколько хороших указателей! Как вы вставляли строки в базу данных SQL? Один за другим или что-то вроде параметра значения таблицы, как упомянуто выше? Мне нужна скорость, я буду обрабатывать 1000 записей в секунду. - person enlightenedOne; 07.03.2013

Сначала рассмотрим самую простую часть. Когда у вас есть данные из ATS в памяти, вы можете использовать SqlBulkCopy, чтобы очень быстро вставить много строк в SQL-сервер (он работает как BCP, но из .NET).

Теперь самое сложное - быстро получить данные от ATS. Я ничего не знаю о вашей схеме Pkey / Rkey. Однако следует подумать о нескольких вещах:

1) Выполнение запросов к ATS с одним ключом PartitionKey и диапазоном ключей RowKey выполняется быстрее всего. Если ваши запросы не содержат условия для RowKey, вы, возможно, столкнетесь с токенами продолжения, даже если у вас меньше 1000 строк и указан PartitionKey.

2) Если вам нужно получить ТОННУ данных из ATS и можно разделить работу на кучу отдельных и хорошо выполняющихся запросов, рассмотрите возможность распределения ваших запросов в сообщениях очереди, а затем попросите несколько процессоров обрабатывать каждый запрос индивидуально в параллельном режиме.

3) Очистка может быть интересной. Вы можете очищать 100 сущностей за раз, используя пакетные транзакции, поэтому, если ваши индивидуальные запросы позволяют это, после обработки данных на сервере sql вы можете использовать те же самые сущности в памяти и очищать их по 100 за раз для каждого ключа раздела (это будет в меру быстро). В качестве альтернативы, если вы можете, вы можете разделить свою таблицу на несколько таблиц, разделенных по какой-либо дате или другому ключу, и удалить данные, удаляя таблицу за раз. Например, если у вас есть большая таблица заказов, которую вам нужно переместить в SQL, вместо одной таблицы заказов создайте ежемесячные таблицы заказов: Orders201301..thru..Orders2xxx_12 ... и после импорта заказов за месяц, просто убейте эту таблицу с помощью одной команды (работает очень быстро).

person Igorek    schedule 07.03.2013