Мои два вопроса:
- Могу ли я использовать кластерные индексы для ускорения массовой вставки в большие таблицы?
- Могу ли я по-прежнему эффективно использовать отношения внешнего ключа, если мой столбец 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 для всей таблицы?
Большое спасибо за любые предложения или объяснения.