Индекс PostgreSQL HASH

Кто-нибудь знает ситуацию, когда вместо B-TREE следует использовать PostgreSQL HASH, потому что мне кажется, что это ловушка. На СОЗДАНИЕ или обслуживание им требуется намного больше времени, чем для B-TREE (по крайней мере, в 10 раз больше), они также занимают больше места (для одного из моих table.columns B-TREE занимает 240 МБ, а HASH будет возьмите 4 ГБ), и я, кажется, понял из моего поиска в Google, что они не выбирают быстрее, чем B-TREE; однако, возможно, недавно HASH был оптимизирован или Google ошибался.

В любом случае, я хотел узнать мнение и опыт вашего парня. Если эти HASH злы, люди должны знать.

Спасибо Также: как насчет MySQL HASH?

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
29
0
9 877
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Хеши работают быстрее, чем B-деревья, в случаях, когда у вас есть известное значение ключа, особенно известное уникальное значение.

Хеши следует использовать, если рассматриваемый столбец никогда предназначен для сканирования сравнительно с командами < или >.

Хэши - это сложность O(1), B-деревья - сложность O(log n) (iirc), следовательно, для больших таблиц с уникальными записями получение ITEM = "foo" будет наиболее эффективным способом его поиска.

Это особенно практично, когда эти уникальные поля используются в условии соединения.

На самом деле, это в значительной степени то, о чем я думал, прежде чем изучать взгляды разработчиков PostgreSQL. Но кажется, что даже для описанной вами ситуации HASH не превосходят B-TREE с точки зрения эффективности и результативности, поскольку кажется, что теоретический алгоритм не был настолько практичным. Спасибо

Nicholas Leonard 30.12.2008 04:02

Следует отметить, что в версии 8.4 решена проблема, когда хеш-индексы были менее эффективны и медленнее, чем индексы в виде b-дерева. postgresql.org/docs/8.4/static/release-8-4.html#AEN95616

heycarsten 11.12.2010 00:28

Только один вопрос, насколько я знаю, поиск по двоичному дереву - это O (logn), а не O (n * logn), я прав?

Juan Antonio Gomez Moriano 18.01.2013 10:20

Хазинг - это O(1)в памяти, но с базой данных данные часто находятся на диске, индекс также может быть на диске, а время доступа к диску >> время доступа к ОЗУ. Я не помню из класса базы данных, как именно это работало, но в некоторых случаях это не O(1). Я бы все равно ожидал, что хэш будет намного быстрее, но в Postgres 9.5 хеш, как сообщается, лишь немногим быстрее, чем b-tree, к тому же он не полностью безопасен.

sudo 16.06.2016 03:38

Ага. По правде говоря, вы редко получаете постоянную производительность в «реальном мире», всегда есть какая-то реальность, которая усложняет задачу. Например, доступ к памяти может быть O(1), но в зависимости от того, о какой памяти вы говорите, это могут быть очень большие или очень маленькие значения 1;). L1 / L2 / L3 / Ram / Swap не имеют одинаковой скорости, но сам алгоритм по-прежнему считается O(1).

Kent Fredric 19.06.2016 10:00

Поскольку точка http://www.postgresql.org/docs/9.2/static/sql-createindex.html Хеш-индекс все еще не является безопасным для WAL; это означает, что они не на 100% надежны для сбоев (индекс должен быть восстановлен, и при репликации может произойти неправильный ответ). Проверьте также http://www.postgresql.org/docs/9.1/static/wal-intro.html

Это также верно для потоковой или файловой репликации и по-прежнему актуально для версии 9.5. postgresql.org/docs/9.5/static/indexes-types.html

gillesB 20.01.2016 12:57

Начиная с версии 10, это уже не так. предприимчивыйb.com/blog/postgresqls-hash-indexes-are-now-cool

soupdog 27.12.2018 19:54

Я не пробовал этого, но рассматриваю этот подход, чтобы использовать хеш-индексы в незарегистрированных временных таблицах.

Насколько я понимаю, они строятся быстрее, занимают меньше места и запрашивают немного быстрее, чем b-tree.

Согласно этот тест, хеш-индексы немного быстрее и немного меньше, чем индексы BTree. Однако вы не можете создать с ними уникальный хеш-индекс - кроме того, они не регистрируются в WAL.

Лучше использовать хеш-индекс для текстовых столбцов, поиск по которым выполняется только с помощью оператора =. Например, столбец URL-адреса, который необходимо проиндексировать для поиска.

Хеш-индекс составляет примерно 30% от размера индекса B-дерева для чего-то вроде URL.

Уменьшенный размер позволяет PostgreSQL более эффективно использовать свою кеш-память (также известную как shared_buffers).

Другие вопросы по теме