Intereting Posts
Сообщение об ошибке: (поставщик: поставщик общей памяти, ошибка: 0 – на другом конце канала нет процесса). Hibernate пользователь и друзья добавляют другой столбец ORACLE Преобразование длинной миллисекунды в дату Ошибка доступа к Vba 91 Вставка данных в мс-доступ из java Есть ли способ получить доступ к базе данных MSSQL непосредственно из приложения Android? Diff. между датами – SQL plus Проблема с PreparedStatement, которая использует объединение запросов selects и IN CLAUSE SQL, который возвращает все перестановки суммированного столбца Динамическая лямбда для платформы Entity Framework для выполнения поиска Поиск заполненных прямоугольников с учетом координат x, y с использованием SQL SQL-запрос распределения частоты для подсчета диапазонов с групповым включением и подсчетами 0 Использование groupby в группе sql с подстрокой специального символа с sqlite Sql Query Pervious Row Optimization

Нужно ли создавать индексы для внешних ключей?

У меня есть таблица A и таблица B A имеет внешний ключ B на первичный ключ B , B_ID .

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

Нужно ли мне отдельно создавать индекс на A.B_ID или если это предусмотрено наличием внешнего ключа?

Только ограничение внешнего ключа не предоставляет индекс – нужно (и должно) создавать.

Создание внешнего ключа автоматически не создает индекс на A.B_ID. Поэтому, как правило, имеет смысл с точки зрения эффективности запросов создавать отдельный индекс на A.B_ID.

Если вы когда-либо удаляете строки в B, вам определенно нужно индексировать A.B_ID. В противном случае Oracle должен будет выполнить полное сканирование таблицы в A при каждом удалении строки из B, чтобы убедиться, что нет сиротских записей (в зависимости от версии Oracle могут быть и дополнительные блокирующие последствия, но они уменьшаются в более поздних версиях Oracle).

Просто для получения дополнительной информации: Oracle не создает индекс автоматически (как и для уникальных ограничений), потому что (a) не требуется принудительное принуждение, и (b) в некоторых случаях вам это не нужно.

Однако большую часть времени вы захотите создать индекс (на самом деле, в Oracle Apex есть отчет «неиндексированных внешних ключей»).

Всякий раз, когда приложение должно иметь возможность удалять строку в родительской таблице или обновлять значение PK (что более редкое), DML будет страдать, если индекс не существует, поскольку ему придется заблокировать всю дочернюю таблицу.

Случай, когда я обычно предпочитаю не добавлять индекс, – это то, где FK является таблицей «статических данных», которая определяет домен столбца (например, таблицу кодов состояния), где обновления и удаления в родительской таблице никогда не выполняются непосредственно приложением. Однако, если добавление индекса в столбец дает преимущества для важных запросов в приложении, то индекс по-прежнему будет хорошей идеей.

SQL Server никогда не добавлял индексы в столбцы внешнего ключа автоматически – ознакомьтесь с отличным отчетом Ким Триппа на фоне и истории этого городского мифа.

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

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

НО

Есть несколько баз данных, которые уже автоматически создают индексы для внешних ключей. Jet Engine (файлы Microsoft Access) Firebird MySQL

НАВЕРНЯКА

SQL Server Oracle

НЕ

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

Наиболее существенным здесь, по-видимому, будет избирательность: если значения в индексе будут сильно дублированы, то это может дать лучшую производительность, чтобы отбросить индекс (если это возможно) и разрешить сканирование таблицы.