Там, где я нахожусь, есть основная система, работающая на большом мэйнфрейме AIX. Для создания отчетов и операций существует ночной дамп из мэйнфрейма в SQL Server, так что каждый из наших 50-ти клиентов находится в своей собственной базе данных с идентичными схемами. Каждую ночь этот дамп занимает около 7 часов, и мы ничего не можем с этим поделать: мы застряли на том, что предоставил поставщик приложений.
После дампа на сервер sql мы используем его для запуска ряда других ежедневных процедур. Одной из таких процедур является импорт данных в своего рода таблицу «песочницы» для управленческих отчетов, которая объединяет записи из особенно важной таблицы из разных баз данных в одну таблицу, которую менеджеры, которые не знают sql, могут использовать для запуска специальных отчетов. не затирая остальную часть системы. Это, опять же, бизнес: руководители хотят этого, и у них есть возможность увидеть, как мы это реализуем.
Процесс импорта этой таблицы сам по себе занимает пару часов. Он фильтрует около 40 миллионов записей, распределенных по 50 базам данных, в 4 миллиона записей, а затем индексирует их по определенным столбцам для поиска. Даже в пару часов это по-прежнему меньше трети первоначальной загрузки, но у нас заканчивается время для ночной обработки, мы не контролируем дамп мэйнфрейма, и мы контролируем это. Поэтому мне было поручено искать способы улучшить существующую процедуру.
В настоящее время философия заключается в том, что быстрее загружать все данные из каждой клиентской базы данных, а затем индексировать их за один шаг. Кроме того, в целях избежания сбоев в работе других важных систем в случае, если она работает долго, пара крупных клиентов всегда запускается первой (основной индекс в таблице - по полю клиентов). Еще одна вещь, которую мы начинаем делать, это загружать данные от нескольких клиентов одновременно, а не последовательно от каждого клиента.
Итак, мой вопрос: какой самый эффективный способ загрузить эту таблицу? Правильно ли мы думаем, что индексирование позже лучше? Или мы должны создать индексы перед импортом данных? Должны ли мы загружать таблицу в порядке индекса, чтобы избежать массового переупорядочения страниц, а не крупных клиентов в первую очередь? Может ли параллельная загрузка усугубить ситуацию, вызвав одновременный доступ к большому количеству дисков или лишив нас возможности контролировать порядок? Есть другие идеи?
Обновление
Ну, что-то не так. Я смог провести некоторые тесты в течение дня, и нет никакой разницы во времени загрузки, создаются ли индексы в начале или в конце операции, но мы экономим время на построение самого индекса ( Курс строится практически мгновенно без данных в таблице).