Массовая вставка в индекс HEAP по сравнению с индексом CLUSTERED, где минимальное ведение журнала невозможно (SQL Server 2008).

В настоящее время используется инструмент Informatica, и у нас есть хранимые процедуры, которые удаляют кластеризованные индексы, а затем добавляют их обратно в базу данных. В хранимой процедуре, где мы добавляем кластеризованные индексы обратно, у нас есть DDL для индексов, жестко запрограммированный в хранимой процедуре (мы не используем системные таблицы, потому что опасение, что Microsoft изменит системные таблицы и регенерирует оттуда, создает плохой индекс или терпит неудачу). Это вызывает проблемы, когда люди создали кластеризованные индексы, но не подумали об обновлении хранимой процедуры, и в следующий раз, когда происходит массовая обработка, эти индексы исчезнут. Ранее мы сделали это для всех индексов, но переключили некластеризованные индексы на использование отключения/перестроения. Это не вариант, потому что мы больше не сможем вставлять в таблицу, если это делается для кластеризованного индекса, потому что это, по сути, таблица.

Производительность важна, но не все. Хорошая производительность и простота обслуживания превосходят высокую производительность и сложную ремонтопригодность.

После прочтения многих сайтов почти все согласны с тем, что при выполнении массовой вставки данных, упорядоченных не так, как ваш первичный ключ, вставка в кучу с последующим применением pk выполняется быстрее ( http://msdn.microsoft.com/en-us/library/ms177445.aspx , http://msdn.microsoft.com/en-us/library/dd425070(v=sql.100).aspx). Большинство этих сайтов делают предположения, которые я не могу использовать в своей организации и с моим набором инструментов.

В настоящее время из-за наших текущих политик стандартов мы должны использовать ПОЛНУЮ модель восстановления, поэтому минимальное ведение журнала не будет происходить независимо от того, какой выбор я делаю в отношении кучи или кластеризованного индекса.

По словам наших администраторов информатики, указание подсказок tablock или порядка в bcp невозможно через пользовательский интерфейс, и наша организация не приемлет настройку за пределами пользовательского интерфейса из-за удобства обслуживания.

Таким образом, вопрос после всего этого заключается в том, что со всеми вышеперечисленными факторами вы бы порекомендовали нам продолжить наши несколько ненадежные хранимые процедуры, вставить в кластеризованный индекс или иметь какое-то третье решение, намного превосходящее его. Я также понимаю, что есть другие вопросы о стеке, похожие на этот пункт, но они не касаются конкретно массы и/или не делают подобных предположений в своих ответах.


person JStead    schedule 25.08.2011    source источник


Ответы (1)


Мое предложение состояло бы в том, чтобы выполнить массовую загрузку в промежуточную таблицу (кучу или CI, соответствующую порядку файлов), (повторно) построить там кластеризованный индекс, соответствующий целевой таблице, а затем вставить прямо из промежуточной таблицы. Чтобы уменьшить блокировку, эскалацию, использование журнала и т. д., вы можете делать это партиями по 10000 строк за раз, время от времени фиксируя и/или отмечая контрольные точки.

Вы также можете рассмотреть возможность использования препроцессора (возможно, C#), который берет файл журнала и создает новый с правильным порядком сортировки.

Также я думаю, что вам безопаснее использовать sys.indexes и т. д., чем жестко кодировать структуры индексов в коде. Microsoft гораздо менее вероятно изменит имя столбца в sys.indexes, чем кто-то в вашем магазине (без обид) изменит индекс, но забудет обновить жестко запрограммированное определение в процедуре.

person Aaron Bertrand    schedule 25.08.2011
comment
+1 за использование sys.indexes. Даже если MS изменит это представление, это будет разовое изменение, а не сохранение sp всякий раз, когда в индексы вносятся изменения. - person WT_W; 25.08.2011
comment
В настоящее время это находится на промежуточном столе, но я не думаю, что о предварительном промежуточном столе не может быть и речи. В настоящее время я представил решение с использованием системных таблиц, и оно было довольно причудливым, к сожалению, страх перед изменением/добавлением Microsoft не мой, а руководителя. Я дал вам +1, но придержал чек на случай, если у кого-то есть решение с серебряной пулей. Я ценю помощь, хотя она подтвердила многие мои мысли и дала мне кое-что для размышлений. - person JStead; 25.08.2011
comment
Людям нужно преодолеть свой страх перед тем, что Microsoft что-то изменит. В SQL Server представления каталога никуда не делись — это уже не 2000 дней. Интересно, потребуется ли отложенное развертывание или серьезная проблема с данными, чтобы они поняли, что жесткое кодирование этих определений гораздо более рискованно, чем полагаться на представления каталога. Именно для этого они там. - person Aaron Bertrand; 25.08.2011