2013-03-06 2 views
1

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

Любые идеи, как это сделать наиболее эффективно? Благодаря!

+0

Когда вы говорите о чистке, вы имеете в виду, что вы удалены?Поскольку ваш вопрос не имеет смысла, если вы хотите, чтобы что-то было удалено из ATS в SQL – Igorek

+0

Извините, я имел в виду скопированный с последними данными для отчетности :) – enlightenedOne

+0

@Igorek - у вас есть решение? – enlightenedOne

ответ

2

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

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

+0

Да, данные хорошо разделены, и я знал, что эта часть будет быстрой, но как об отдельных транзакциях в базу данных SQL? Один из строк в цикле не будет оптимальным. Мысли? – enlightenedOne

+1

Вы можете использовать хранимую процедуру, которая принимает параметр значения таблицы. Это будет один вызов db и, возможно, одна вставка на пакет.http: //msdn.microsoft.com/en-us/library/bb510489.aspx – knightpfhor

+0

@knightpfhor - спасибо за ваше предложение, я исследую этот маршрут! – enlightenedOne

0

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

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

+0

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

0

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

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

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

2) Если вам нужно захватить TON данных из ОВД и может разделить работу в кучу индивидуальных и хорошо выполняемых запросов, рассмотрите вопрос о распределении ваших запросов в сообщениях очереди, а затем попросите несколько процессоров обрабатывать каждый запрос по отдельности в paralelle.

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

Смежные вопросы