2016-03-30 3 views
0

Я заполняю таблицу среднего размера (60 ГБ, 500 миллионов строк). Процесс завершается достаточно быстро, если в таблице нет первичного ключа (~ 1 час с использованием массовой вставки), но он занимает ~ 10 раз дольше, если я создаю эту таблицу с первичным ключом. Я предполагаю, что это связано с тем, что для проверки ограничения уникальности требуется время, а также обновление индекса для каждой вставки.Проблема с первичным ключом

Я думал, что хорошим решением будет добавить первичный ключ позже, поскольку индексация на уже заполненной таблице должна быть намного быстрее по сравнению с инкрементной индексацией. Но sqlite, похоже, не имеет возможности добавлять первичный ключ после создания таблицы (не знаете почему?).

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

Или любое лучшее решение рекомендуется?

ответ

1

С чисто технической точки зрения, уникальный индекс имеет точно такой же эффект, как первичный ключ. (В SQLite некоторые первичные ключи позволяют NULL для обратной совместимости.)

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

См. Также Is CREATE UNIQUE INDEX or INTEGER PRIMARY KEY more performant in SQLite.

+0

Но в соответствии с вашим ответным ответом первичный ключ может иметь преимущество в производительности, если оно находится в столбце INTEGER? – max

+0

Да, но ваша таблица использовала другой тип. –

+1

НЕПРАВИЛЬНЫЙ КЛЮЧ INTEGER не ускользнул от вставки. –

0

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

Я только что нашел это, что отличная запись о том, как ускорить работу в sqlite3.

Improve INSERT-per-second performance of SQLite?

Смежные вопросы