Мои два вопроса:
- Могу ли я использовать кластерные индексы для ускорения
объемных вставок в большие столы?
- Могу ли я тогда еще эффективно использовать
отношения внешнего ключа, если мой
Столбец IDENTITY не является кластеризованным
индекс больше?
Чтобы уточнить, у меня есть база данных с парой очень больших (от 100 до 1000 миллионов строк) таблиц, содержащих данные компании. Обычно в такой таблице содержатся данные о 20-40 компаниях, каждая из которых имеет свой собственный «чанк», помеченный как «CompanyIdentifier» (INT). Кроме того, в каждой компании имеется около 20 отделов, каждый из которых имеет свой собственный «подраздел», помеченный «DepartmentIdentifier» (INT).
Часто случается, что целый «кусок» или «подчанк» добавляется или удаляется из таблицы. Первой моей мыслью было использование разбиения таблиц на эти блоки, но, поскольку я использую SQL Server 2008 Standard Edition, я не имею на это права. Тем не менее, большинство моих запросов выполняются на «чанке» или «чанке», а не на таблице в целом.
Я работал над оптимизацией этих таблиц для следующих функций:
- Запросы, которые выполняются на подразделах
- «Бенчмаркинг» запросов, которые выполняются для всей таблицы
- Вставка / удаление больших фрагментов данных.
Для 1) и 2) Я не столкнулся с большим количеством проблем. Я создал несколько индексов для ключевых полей (также содержащих CompanyIdentifier и DepartmentIdentifier, где это полезно), и запросы выполняются нормально.
Но для 3) я изо всех сил пытался найти хорошее решение.
Моя первая стратегия состояла в том, чтобы всегда отключать индексы, массово вставлять большой кусок и перестраивать индексы. Сначала это было очень быстро, но теперь, когда в базе данных много компаний, каждый раз для перестройки индекса требуется очень много времени.
В данный момент моя стратегия изменилась, и я просто оставляю индекс включенным во время вставки, поскольку теперь это кажется быстрее. Но я хочу еще больше оптимизировать скорость вставки.
Кажется, я заметил, что при добавлении кластерного индекса, определенного в CompanyIdentifier + DepartmentIdentifier, загрузка новых "кусков" в таблицу происходит быстрее. Прежде чем я отказался от этой стратегии в пользу добавления кластеризованного индекса к столбцу IDENTITY, несколько статей указывали мне на то, что кластерный индекс содержится во всех других индексах, и поэтому кластерный индекс должен быть как можно меньше. Но теперь я думаю о возрождении этой старой стратегии, чтобы ускорить вставки. Мой вопрос, будет ли это разумным, или я пострадаю от снижения производительности в других областях? И это действительно ускорит мои вставки или это только мое воображение?
Я также не уверен, действительно ли в моем случае нужен столбец IDENTITY. Я хотел бы иметь возможность устанавливать отношения внешнего ключа с другими таблицами, но могу ли я использовать для этого что-то вроде схемы CompanyIdentifier + DepartmentIdentifier + [uniquifier]? Или это должен быть фрагментарный номер IDENTITY по всей таблице?
Большое спасибо за любые предложения или объяснения.