|
Индексы на поля с foreign key
|
|||
---|---|---|---|
#18+
Коллеги, провел тесты по производительности выборок с джоинами двух таблиц по foreign key Выборки на таблицах с количествами от 2 миллионов записей. Замерял выборки с по индексированным полям и без индексов. Не увидел никакой разницы. Может я что то не корректно делал, но вопрос остался: Нужно ли в Postgre индексировать поля с foreign key или так сойдет? Помогите с квалифицированным ответом! ... |
|||
:
Нравится:
Не нравится:
|
|||
09.09.2018, 17:30 |
|
Индексы на поля с foreign key
|
|||
---|---|---|---|
#18+
wewewew, Так зависит же от запросов... покажите запросы покажите их планы и будет все видно. -- Maxim Boguk лучшая поддержка PostgreSQL: dataegret.ru ... |
|||
:
Нравится:
Не нравится:
|
|||
09.09.2018, 20:38 |
|
Индексы на поля с foreign key
|
|||
---|---|---|---|
#18+
wewewew, я грит библиотеку грузил в самосвал совковой лопатой и что интересно -- наличие шкафов и алфавитных указателей не ускорило... ... |
|||
:
Нравится:
Не нравится:
|
|||
09.09.2018, 21:37 |
|
Индексы на поля с foreign key
|
|||
---|---|---|---|
#18+
Maxim Boguk, Да, конечно запрос: SELECT sy.sysname FROM public.temp_sys as sy left join public.temp_category on public.temp_category.categoryid = sy.categoryid схема во вложении ... |
|||
:
Нравится:
Не нравится:
|
|||
09.09.2018, 22:22 |
|
Индексы на поля с foreign key
|
|||
---|---|---|---|
#18+
wewewewMaxim Boguk, Да, конечно запрос: SELECT sy.sysname FROM public.temp_sys as sy left join public.temp_category on public.temp_category.categoryid = sy.categoryid схема во вложении 1)если у вас FK с sy.categoryid на temp_category.categoryid - то индекс по temp_category.categoryid у вас есть без вариантов иначе бы вам FK не дали создать 2)несмотря на 1) для конкретно такого запроса смысла в индексе все равно нет... просто потому что таблица public.temp_sys скорее всего сильно больше чем public.temp_category а значит план будет hash join которому что есть индекс по temp_category.categoryid что нет его - как то ну совсем без разницы. Вот если бы в public.temp_sys было 10 строк а в public.temp_category миллион то ситуация была бы другой в таком запросе но это какая то очень вымышленная ситуация. 3)более того в таком запросе на новых версиях базы при наличии FK - left join вообще не производится за полной ненужностью (даже если 10 и миллион строк). PS: учитесь использовать explain analyze и читать планы. -- Maxim Boguk лучшая поддержка PostgreSQL: dataegret.ru ... |
|||
:
Нравится:
Не нравится:
|
|||
09.09.2018, 22:30 |
|
Индексы на поля с foreign key
|
|||
---|---|---|---|
#18+
wewewewНужно ли в Postgre индексировать поля с foreign key или так сойдет? Сам Postgre SQL не генерит индекс по foreign key. Перед тестами рекомендую собрать статистику по обоим таблицам Код: plsql 1. 2.
И приведенный запрос совершенно не информативный для раскрытия вопроса т.к. даные читаются только из public.temp_sys ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2018, 13:11 |
|
Индексы на поля с foreign key
|
|||
---|---|---|---|
#18+
wewewewНужно ли в Postgre индексировать поля с foreign key или так сойдет? Индексы создаются не только для улучшения некоторых выборок, но еще и для того чтобы обеспечить хорошую производительность при обновлении/удалении записей в таблице, на которую ссылается внешний ключ. Без индекса серверу придется просканировать всю таблицу чтобы обеспечить целостность FK, а это для больших таблиц очень ресурсоемкая операция. Поэтому и рекомендуют создавать индексы на FK. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2018, 18:49 |
|
Индексы на поля с foreign key
|
|||
---|---|---|---|
#18+
Коллеги, большое спасибо за ответ! Понял, что единого правила по индексированию FK нет. Зависит от многих факторов. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2018, 19:24 |
|
Индексы на поля с foreign key
|
|||
---|---|---|---|
#18+
Maxim Boguk, Максим у меня был вопрос по индексированию поля sy.categoryid а не temp_category.categoryid ... |
|||
:
Нравится:
Не нравится:
|
|||
11.09.2018, 11:41 |
|
Индексы на поля с foreign key
|
|||
---|---|---|---|
#18+
Владимир Затуливетер, То есть можно взять за общее правило то, что всегда стоит индексировать поля с FK? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.09.2018, 11:44 |
|
Индексы на поля с foreign key
|
|||
---|---|---|---|
#18+
wewewewВладимир Затуливетер, То есть можно взять за общее правило то, что всегда стоит индексировать поля с FK? Дурное правило... получите очень много лишних индексов в базе.. а они сильно небесплатные. Индекс нужен если у вас ожидаются частые удаления из temp_category (или обноления значений temp_category.categoryid) как правило из подобных таблиц-справочников не удаляют ничего поэтому индекс именно для поддержки FK КАК ПРАВИЛО не нужен. Для других задач вполне может быть нужен (но это другие задачи а не FK). -- Maxim Boguk лучшая поддержка PostgreSQL: dataegret.ru ... |
|||
:
Нравится:
Не нравится:
|
|||
11.09.2018, 12:20 |
|
Индексы на поля с foreign key
|
|||
---|---|---|---|
#18+
wewewewТо есть можно взять за общее правило то, что всегда стоит индексировать поля с FK? Соблюдайте баланс :) Как Максим заметил индексы не бесплатны, при большом кол-ве индексов на таблице вам нужно будет больше места для хранения данных, вставки и обновления данных будут более медленными, ну и не факт что все индексы эти будут использоваться. У меня такие правила: 1. Для небольших и средних таблиц я всегда создаю индексы на FK. Тут нет интенсивных вставок и обновлений, данные как правило более статичны, накладные расходы от таких индексов небольшие. 2. Для больших таблиц с интенсивной нагрузкой я не делаю индексы на FK если индекс не будет нужен для каких либо запросов к этой таблице. В редких случаях вообще не создаю FK, все зависит от ситуации и на сколько большая таблица и какие требования бизнеса. Это из моего опыта, то что у вас там я не знаю, поэтому сами смотрите создавать или нет, информации вроде бы достаточно тут сообщили по этому вопросу. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.09.2018, 13:36 |
|
|
start [/forum/topic.php?fid=53&msg=39700825&tid=1995433]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
44ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
43ms |
get tp. blocked users: |
1ms |
others: | 317ms |
total: | 443ms |
0 / 0 |