Быстрее ли применять несколько индексов к таблице один за другим или с несколькими отдельными запросами? - PullRequest
2 голосов
/ 23 мая 2019

Речь идет не о индексах с несколькими столбцами (составных), а об индексах с одним столбцом. Это больше касается производительности, чем функции.

У меня есть сценарий, в котором мне нужно применить несколько индексов к одной таблице. Прямо сейчас мне нужно проверить, существуют ли они, а затем применить их один за другим.

Мой вопрос заключается в том, что от начала до конца все время занимает более нескольких часов, чтобы применить их все. Я хочу максимально сократить это общее время (сократить временное окно для их применения)

серийный один за другим

index1 => index2 = index3 =>...indexN

Все данные применяются одновременно к столу

index1 
index2 
index3 
...
indexN

Количество индексов в некоторых таблицах составляет 10+, существует несколько таблиц, и это будет применяться к нескольким базам данных (несколько сотен). У меня нет никакого контроля над хранилищем данных или SQL Server здесь для магического типа SAN вещи. У меня 16 процессоров и сервер Enterprise, но общее количество всех таблиц во всех базах данных нетривиально. Подумайте с точки зрения количества таблиц в нескольких ГБ и нескольких хранилищ ТБ для всех из них в почти 3000 таблицах. Это все кластерные индексы, и большинство из них составные

1 Ответ

0 голосов
/ 25 мая 2019

Хотя простого метода для достижения этой цели, по-видимому, не существует, если при тестировании по достаточно большой таблице было обнаружено, что приложение из 10 новых индексов с отдельными запросами и конфигурацией одновременно обрабатывает (все началось почти в то же время, отдельно) действительно был быстрее, чем отдельный скрипт , где индексация применялась последовательным способом со значительным запасом. Это также, по-видимому, не оказало отрицательного воздействия, которое можно было бы обнаружить при условии, что у SQL Server достаточно ресурсов для обработки этого воздействия.

Просто чтобы обновить масштаб и масштаб, не вдаваясь в детали:

  • Проверено на нескольких таблицах с масштабом от тривиального (3,6M строк) до большего
  • Проверено на наборах с индексами 30+ (строки 200M-500M)
  • Проверено на таблицах со строками от 1,6 до 1,9 В
  • Количество индексов варьировалось от 3-30 + в зависимости от таблицы
  • размер базы данных был 1 ТБ
  • общий объем от 0 строк до почти 2B строк в 2800+ таблицах
  • Сервер был в основном загружен до максимальной точки, которую он мог обрабатывать и удерживал там с помощью автоматизации

Примеры реальных результатов соответствовали сокращению времени выполнения от 9 до 14 часов до менее 43 минут, при этом все индексы применялись одновременно для одной таблицы, а индексирование нескольких таблиц в одной базе данных, а также в более чем 200 отдельных базах данных. , Уровень данных в нескольких ТБ.

Я представил дополнения к индексу, используя Powershell, при этом несколько сотен выполнялись одновременно на разных таблицах, в том числе более 30 на нескольких таблицах.

...