Ваши вопросы:
Не будет ли FK-индекс поглощать слишком много пространства / времени при увеличении таблицы нескольких миллионов записей?
Не беспокойтесь , здесь, по крайней мере, не беспокойтесь " по мере роста таблицы ". Требования к пространству и времени будут расти линейно в зависимости от количества добавляемых записей.
(ну, технически не совсем, если вы пересекаете границы, которые вводят дополнительный уровень в дереве, но обычно это база данных с миллионов записей, глубина дерева там, где это должно быть)
В таком случае, стоит ли переходить на FK-индекс «каждый раз?»
Обычно да , но это действительно индивидуальная ситуация. Следует также учитывать, что вместо простого индекса FK используются индексы, которые включают дополнительные столбцы и могут использоваться как для поиска, так и для охвата [частей] списка выбора. Опять же, выбор такой альтернативы (или дополнительных индексов) зависит от конкретного случая, извините ;-) ...
В каком случае я НЕ должен применять FK или индексировать его или не делать ни одного из них (конечно, я могу обработать ЛОТ из приложения)
Конечно, во всех таких случаях исключаются случаи, когда важно, чтобы ссылочная целостность изначально поддерживалась самой dbms (Такая целостность может альтернативно управляться на уровне приложения / процессов, которые вставляют и удаляют строки в базе данных)
- случаи, когда большинство критических запросов [времени или ресурса] подразумевают другие фильтры в таблице и такие, что SQL может затем разрешить JOIN, проверяя значения в самой таблице (или в индексе покрытия, в частности, один где FK - не первый перечисленный столбец) для [маленького] подмножества возможных результатов, полученных этими другими фильтрами.
- случаи, когда таблица таблиц относительно мала (таблицы поиска и т. П.), Поскольку SQL часто выбирает стратегию сканирования для них, а также по мере их кэширования). Но тогда они небольшие и, как правило, относительно статичные, поэтому стоимость дополнительных индексов не будет проблемой ...
- может быть еще несколько случаев ...
Любой другой способ ускорить JOIN или другие такие трудоемкие поиски?
Когда речь идет о перемещении данных, например, при добавлении значительного объема данных и т. Д. Часто целесообразной стратегией является удаление индексов (или некоторых из них), выполняйте CUD (INSERT / UPDATE / DELETE операции, а затем пересоздать индексы. Конечно, это не всегда возможно, если во время обновлений выполняется поиск в базе данных и т. Д.
Также обратите внимание на FILL_FACTOR, связанный с индексами, так как разумный выбор для них сводит фрагментацию индекса к минимуму (за счет потребления, по сравнению с немного большим пространством) по крайней мере между плановым обслуживанием индексов