Этот вопрос возникает после прочтения комментария в этом вопросе:SQL - многие-ко-многим таблице первичный ключ
При создании много-ко-многим таблицу, вы должны создать композитный первичный ключ в двух столбцах внешнего ключа или создать первичный ключ суррогата с автоматическим приращением, и просто поместить индексы на ваши два столбца FK (и, возможно, уникальное ограничение)? Каковы последствия для производительности для вставки новых записей/повторной индексации в каждом случае?
В основном, это:
PartDevice
----------
PartID (PK/FK)
DeviceID (PK/FK)
против этого:
PartDevice
----------
ID (PK/auto-increment)
PartID (FK)
DeviceID (FK)
Комментатор говорит:
делая два идентификатора рК означает, что таблицы физически отсортированы по диск в этом порядке. Поэтому, если мы вставим (Part1/Device1), (Part1/Device2), (Part2/Device3), то (Часть 1/Устройство3) база данных должна будет разбить таблицу и вставить последнюю цифру между записями 2 и 3. Для многих записей это становится очень проблематичным , поскольку он включает перетасовку сотен, тысяч или миллионов записей каждый раз, когда он добавляется. В отличие от этого, автоинкрементный ПК позволяет записывать новые записи на конец.
Причина, почему я спрашиваю, потому что я всегда был склонен сделать составной первичный ключ не суррогатного столбца автоинкрементного, но я не уверен, что если суррогатный ключ на самом деле более производительным.
отличный вопрос, ожидая ответа от sql guru :) – sbczk
Вот вопрос силимара, размещенный на SO: http://stackoverflow.com/questions/344068/sql-server-clustered-index-order-of-index- вопрос – Tony
(Пробовал добавить это к моему предыдущему комментарию, но не могу) В зависимости от количества вставок вы также можете периодически перестраивать свой индекс, чтобы он быстро возвращал результаты. В SQL Server вы также можете настроить FILLFACTOR индекса, чтобы предоставить достаточно места для вставок, прежде чем он будет перемещать данные. – Tony