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, то прочитать два индекса и выбрать совпадения гораздо проще, чем посчитать хэши, отсортировать их, и затем отбирать совпадения. И чем больше массив данных, тем заметнее выигрыш.
Что же до хэш-индекса, то тут всё зависит от хэшируемых данных. Для компактных данных согласен, с эффективностью будет туговато. Но есть есть надобность поиска по, скажем, длинным строкам, то тут хэш-индекс просто обязан дать определённый профит именно за счёт своей компактности.
В общем, не всё так уж и однозначно имхо.
Да, действительно, начиная с версии 10 количество бакетов увеличивается динамически.
"Hash indexes may expand the number of bucket pages as the number of rows indexed grows.." https://www.postgresql.org/docs/10/hash-intro.html
Исправил статью, спасибо за наблюдение
Ещё бы в сравнении указать размеры обоих индексов
Хеш-индексы в PostgreSQL: быстрый поиск или скрытые проблемы?