Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Индексы на внешних ключах / 19 сообщений из 19, страница 1 из 1
14.05.2021, 22:33
    #40070476
НеофитSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексы на внешних ключах
Хотелось бы услышать от опытных людей как они решают в каких случаях строить индекс на внешний, а когда - нет.

Пример (вырожденный, для иллюстрации. Не делайте так):

Таблица содержит колонку "пол", который хранится в виде числа 0/1. Эта колонка является внешним ключом на "таблицу полов" обычно содержащую две строчки, как когда-то было с sys.dual.

Таблица полов содержит главный ключ (0,1), который требует индекса как это водится. Таблица полов статична, т.е. тип внешнего ключа не важен. Можно cascade, можно нет.

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

Какими правилами руководствуется вы, решая нужен ли индекс на внешнем ключе, если задумывались об этом раньше?
...
Рейтинг: 0 / 0
15.05.2021, 00:36
    #40070484
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексы на внешних ключах
Критерии для создания индексов на полях внешних ключей ничем не отличаются от любых
остальных. Кроме одного дополнительного: полная блокировка таблицы при DML.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
15.05.2021, 00:55
    #40070489
НеофитSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексы на внешних ключах
С первой частью понятно. Вы говорите что наличие внешнего ключа не является фактором при решении нужен индекс или нет.

А что означает полная блокировка таблицы при DML?
...
Рейтинг: 0 / 0
15.05.2021, 01:07
    #40070491
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексы на внешних ключах
НеофитSQLА что означает полная блокировка таблицы при DML?

Что без индекса на полях внешнего ключа таблица блокируется целиком во время DML запросов.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
15.05.2021, 01:21
    #40070492
проходил мимо...
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексы на внешних ключах
маленькая поправка

Dimitry Sibiryakov

НеофитSQLА что означает полная блокировка таблицы при DML?

Что без индекса на полях внешнего ключа таблица блокируется целиком во время DML запросов на мастер-таблице.


кроме того, не на всяком dml.
...
Рейтинг: 0 / 0
15.05.2021, 01:38
    #40070494
Relic Hunter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексы на внешних ключах
Если будет индекс, будет блокироваться индекс на таблице-деталь. Не будет - блокировка всего справочника на update,insert,delete. Наступали на эти грабли.
...
Рейтинг: 0 / 0
15.05.2021, 10:12
    #40070505
mnbvcx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексы на внешних ключах
НеофитSQL, у нас так в вики написано:
ОБЯЗАТЕЛЬНО создаем индексы по полям с foreign key'ями. Без них происходит блокировка всей таблицы при проверке целостности.
...
Рейтинг: 0 / 0
15.05.2021, 18:18
    #40070546
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексы на внешних ключах
На, игру в "испорченный телефон" похоже
...
Рейтинг: 0 / 0
16.05.2021, 02:32
    #40070573
НеофитSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексы на внешних ключах
mnbvcx
НеофитSQL, у нас так в вики написано:
ОБЯЗАТЕЛЬНО создаем индексы по полям с foreign key'ями. Без них происходит блокировка всей таблицы при проверке целостности.


Спасибо, этот ответ на мой первоначальный вопрос самый информативный.

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

Брутально. Я почему-то ожидал что только апдейты изменяющие значение колонки ключа вызовут проверку целостности и сопутствующую блокировку.

Очень полезная инфа.
...
Рейтинг: 0 / 0
16.05.2021, 07:43
    #40070583
НеофитSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексы на внешних ключах
Уже пора засыпать, но в голову лезет такая мысль: а что же происходит с таблицами где одна колонка внешним ключом ссылается на другую?

Как например object_id и parent_id. Я такой давно пользуюсь без индекса на parent_id, это наверное не рекомендуется, ведь такая таблица сама себя может заблокировать.

Завтра обязательно попробую это сделать. Нужно именно delete или update, т.к. insert не должны приводить к перепроверке внешнего ключа, правильно?

Прямо тикающая бомба этот внешний ключ.
...
Рейтинг: 0 / 0
16.05.2021, 09:33
    #40070587
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексы на внешних ключах
О сколько нам открытий чудных... Если доку не читать, конечно, где заготовлен раздел "Locks and Foreign Keys"
...
Рейтинг: 0 / 0
19.05.2021, 09:53
    #40071233
Ivan Durak
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексы на внешних ключах
"чтобы форейн кеи не блокировали таблицы можно дропнуть форейн кей" (с) Сунь Цзы "искуство sql" 9-й век н.э
...
Рейтинг: 0 / 0
19.05.2021, 16:06
    #40071387
НеофитSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексы на внешних ключах
"скорость превыше целостности" - олимпийский лозунг
...
Рейтинг: 0 / 0
19.05.2021, 16:49
    #40071408
Кобанчег
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексы на внешних ключах
НеофитSQL
mnbvcx
НеофитSQL, у нас так в вики написано:
ОБЯЗАТЕЛЬНО создаем индексы по полям с foreign key'ями. Без них происходит блокировка всей таблицы при проверке целостности.


Спасибо, этот ответ на мой первоначальный вопрос самый информативный.
Это просто ответ послушного кодера который делает как указано в методичке без понимания почему так надо.
Вероятно ты просто это хотел услышать поэтому тебе так понравилось.
НеофитSQL
Я испытал это на своем примере, и обнаружил что даже нулевой некомиттед апдейт (нулевой - в смысле не изменяющий значение основной таблицы содержащий интересующий нас ключ) блокирует все другие таблицы, которые на нее ссылаются, при отсутствии индексов.
Теперь попробуй выкинуть свою бредовую терминологию и сказать нормальным языком, а лечше покажи кейс.

Твои бесконечные попытки использовать "умные" термины делают твои посты еще более нелепыми.
Все когда-то были чайниками но не все пытались с надутыми щеками строить из себя непонятно кого.
...
Рейтинг: 0 / 0
19.05.2021, 16:55
    #40071412
Кобанчег
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексы на внешних ключах
НеофитSQL
"скорость превыше целостности" - олимпийский лозунг
Целостность можно проверять на разных уровнях. Может ETL tool отвечать за целостность.
Можно отключать ключи перед загрузкой и выполнять foreign key enable validate когда нагрузка минимальна.
Можно вспомнить про rely disable novalidate и какие плюсы это несет для оптимизатора.
Можно подумать чем отличается валидация при вставке и валидация запросом с точки зрения производительности.
Можно смотреть на проблему под разными углами, а можно увидеть желаемую ремомендацию ноунейма из интернетов и слепо ей следовать...

...ну пока не придётся грузить сотни миллионов строк в таблицу фактов с десятком измерений. Тогда придётся снова подумать, хотя до этого может и не дойти.
...
Рейтинг: 0 / 0
19.05.2021, 17:03
    #40071417
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексы на внешних ключах
Кобанчег
грузить сотни миллионов строк в таблицу фактов с десятком измерений.

Есть обратная сторона вопроса - привыкши грузить гигазы варезов, начинаешь с трудом воспринимать потребности мелких систем, системочек и системок.
Т.е. тебя просят построить вооот такой запросик, а ты зависаешь на пару часов в метаниях "как зайти в таблицу, как дешевле вязать, а не дешевле ли будет вместо join заюзать group by"... а в базейке той отродясь больше 10 лямов не водилось и тут вообще пофиг как именно самовыражаться :)
...
Рейтинг: 0 / 0
19.05.2021, 17:28
    #40071430
Кобанчег
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексы на внешних ключах
andrey_anonymous
пофиг как именно самовыражаться :)
Пусть самовыражаются на здоровье, только бы поменьше распространяли своё экспертное знание в интернетах.
Сомневаюсь что у советчиков есть понимание когда именно индекс пригодится при DML.
...
Рейтинг: 0 / 0
19.05.2021, 17:38
    #40071435
НеофитSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексы на внешних ключах
andrey_anonymous,

справедливое замечание.

У меня меньше одного "ляма", поэтому неэффективность решений далеко не всегда очевидна.

10 кратная разница в скорости мало видна, когда почти все в миллисекундах.

Отсюда и многие мои вопросы к господам "дальнобойщикам".
Это у вас боковой ветер и температура воздуха влияет на расход топлива, а я на мотоцикле не замечаю.
Но интересно.
...
Рейтинг: 0 / 0
25.05.2021, 16:35
    #40072793
SQL*Plus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексы на внешних ключах
Ivan Durak
"чтобы форейн кеи не блокировали таблицы можно дропнуть форейн кей" (с) Сунь Цзы "искуство sql" 9-й век н.э

В данном случае его можно также заменить ограничением CHECK(gender IN (0, 1))
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Индексы на внешних ключах / 19 сообщений из 19, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]