Нет, создание внешнего ключа для столбца не создает автоматически индекс для этого столбца. Невозможность индексировать столбец внешнего ключа приведет к сканированию таблицы в каждой из следующих ситуаций:
- Каждый раз, когда запись удаляется из ссылочной (родительской) таблицы.
- Каждый раз, когда две таблицы соединяются по внешнему ключу.
- Каждый раз, когда обновляется столбец FK.
В этом примере схема:
CREATE TABLE MasterOrder (
MasterOrderID INT PRIMARY KEY)
CREATE TABLE OrderDetail(
OrderDetailID INT,
MasterOrderID INT FOREIGN KEY REFERENCES MasterOrder(MasterOrderID)
)
OrderDetail будет сканироваться при каждом удалении записи в таблице MasterOrder. Вся таблица OrderDetail также будет сканироваться каждый раз, когда вы присоединяетесь к OrderMaster и OrderDetail.
SELECT ..
FROM
MasterOrder ord
LEFT JOIN OrderDetail det
ON det.MasterOrderID = ord.MasterOrderID
WHERE ord.OrderMasterID = @OrderMasterID
Как правило, отсутствие индексации внешнего ключа является скорее исключением, чем правилом.
В случае отсутствия индексации внешнего ключа он никогда не будет использоваться. Это сделало бы ненужными дополнительные затраты на обслуживание сервера. Таблицы типов могут время от времени попадать в эту категорию, например:
CREATE TABLE CarType (
CarTypeID INT PRIMARY KEY,
CarTypeName VARCHAR(25)
)
INSERT CarType .. VALUES(1,'SEDAN')
INSERT CarType .. VALUES(2,'COUP')
INSERT CarType .. VALUES(3,'CONVERTABLE')
CREATE TABLE CarInventory (
CarInventoryID INT,
CarTypeID INT FOREIGN KEY REFERENCES CarType(CarTypeID)
)
Исходя из общего предположения о том, что поле CarType.CarTypeID никогда не будет обновляться, а удаление записей будет почти никогда, серверные накладные расходы на поддержание индекса в CarInventory.CarTypeID не потребуются, если CarInventory никогда не ищется CarTypeID. 1024 *