TSql, построение индексов до или после ввода данных - PullRequest
8 голосов
/ 28 октября 2010

Вопрос производительности при индексации больших объемов данных.У меня есть большая таблица (~ 30 миллионов строк) с 4 индексированными столбцами для быстрого поиска.В настоящее время я устанавливаю индексы (индексы?), А затем импортирую свои данные.Это занимает примерно 4 часа, в зависимости от скорости сервера БД.Будет ли быстрее / эффективнее сначала импортировать данные, а затем выполнять построение индекса?

Ответы [ 3 ]

8 голосов
/ 28 октября 2010

Я бы умерил ответ af, сказав, что , вероятно, будет в том случае, если «сначала индекс, вставка после» будет медленнее, чем «сначала вставка, индекс после», когда вы вставляете записи в таблица с кластеризованным индексом, но без вставки записей в естественном порядке этого индекса. Причина в том, что для каждой вставки сами строки данных должны быть упорядочены на диске.

В качестве примера рассмотрим таблицу с кластеризованным первичным ключом в поле uniqueidentifier. (Почти) случайный характер guid будет означать, что можно добавить одну строку вверху данных, что приведет к перетасовке всех данных на текущей странице (и, возможно, данных на более низких страницах), но следующий ряд добавлен внизу. Если бы кластеризация была, скажем, в столбце datetime, и вы случайно добавляли строки в порядке дат, то записи, естественно, вставлялись бы в правильном порядке на диске, и дорогостоящие операции сортировки / перестановки данных не потребовались бы.

Я бы поддержал ответ Уинстона Смита «все зависит», но предположил, что ваш кластерный индекс может быть важным фактором в определении того, какая стратегия быстрее для ваших текущих обстоятельств. Вы даже можете попробовать вообще не иметь кластеризованного индекса и посмотреть, что произойдет. Дайте мне знать?

3 голосов
/ 28 октября 2010

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

Единственный способ узнать наверняка, это попробовать оба и выполнить соответствующие измерения, что не составит труда сделать.

3 голосов
/ 28 октября 2010

Вставка данных при наличии индексов заставляет СУБД обновлять их после каждой строки. Из-за этого обычно быстрее сначала вставлять данные, а потом создавать индексы. Особенно, если данных так много.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...