Pull to refresh

Comments 9

Благодарю за занимательную статью. Сам сталкивался с вопросами оптимизации в Postgre. Протестирую на практике ваше решение)

Hash Join в PostgreSQL всегда строит свою временную хеш-таблицу, даже если на соединяемом поле есть хеш-индекс.

Проблема хеш-индекса в том, что каждый поиск требует отдельного обращения к индексу на диске(!). Если в orders миллионы строк, то поиск каждого user_id через хеш-индекс будет слишком дорогим.

Hash Join эффективен, потому что он загружает данные в память(!) один раз и использует их для всех сравнений, а не выполняет отдельные обращения к индексу.

Проблема хеш-индекса в том, что каждый поиск требует отдельного обращения к индексу на диске(!)

Hash Join эффективен, потому что он загружает данные в память(!)

Что-то как-то не срослось... так обращается к индексу для каждой записи или сразу читает всё? проблемный или эффективный? вы уж определитесь, что ли...

Hash Join и хеш-индексы решают разные задачи:

Хеш-индекс – это структура данных на диске, которая позволяет быстро находить отдельные значения (=).

Hash Join – это алгоритм, который массово сопоставляет строки между двумя таблицами, создавая временный хеш в памяти.

Поскольку Hash Join должен обработать все строки соединяемой таблицы, хеш-индекс ему не помогает – он предназначен только для точечного поиска (WHERE column = value)

Задача JOIN - связать записи по условию. И в подавляющем большинстве случаев это условие - равенство значений полей в двух таблицах. Если по полю обоих таблиц есть Hash index, то прочитать два индекса и выбрать совпадения гораздо проще, чем посчитать хэши, отсортировать их, и затем отбирать совпадения. И чем больше массив данных, тем заметнее выигрыш.

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

В общем, не всё так уж и однозначно имхо.

В отличие от B-tree, количество бакетов не изменяется автоматически, что может привести к неэффективному распределению данных при росте таблицы.

А можно узнать, откуда вы это взяли? Про постоянство количества корзин...

Потому как практика показывает иное: fiddle

Sign up to leave a comment.

Articles