2015-06-12 1 views
3

Согласно Can PostgreSQL index array columns?, PostgreSQL может индексировать столбцы массива.Действительно ли PostgreSQL ищет столбцы с массивами строк?

Может ли он выполнять поиск по столбцу массива так же эффективно, как и для типов без массивов?

Например, предположим, что у вас есть строки из таблицы вопросов (например, SO):

title: ... 
content:... 
tags: [ 'postgresql', 'indexing', 'arrays' ] 

И вы хотите, чтобы найти вопросы с тегом 'postgresql'. Будет ли сохранение отношений в таблице соединений быстрее для поиска?

И да, каждый столбец имеет индекс.

+1

http://www.databasesoup.com/2015/01/tag-all-things.html –

ответ

1

Индексы GIN и GiST, как правило, больше простого b-дерева и требуют больше времени для сканирования. GIN быстрее, чем GiST за счет очень дорогих обновлений.

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

С другой стороны, вы избегаете необходимости сканировать b-дерево для идентификаторов желаемых объектов, а затем извлекать их из основной таблицы через соединение. Вы также сохраняете справедливое пространство, используя массив вместо того, чтобы оплачивать 28 байтов на каждую служебную нагрузку для каждого тега в таблице соединений.

Если ваша скорость вставки и обновления на основной таблице довольно низкая - в том числе изменения в тегах - тогда GIN может быть подходящим выбором. В противном случае я, вероятно, пошёл бы на типичное b-дерево в таблице соединений, со вторичным индексом на (tag, object_id), чтобы можно было искать только индексированные объекты для поиска объектов, имеющих данный тег.

В конце концов, самое лучшее, что нужно сделать, это сравнить его для моделирования вашей рабочей нагрузки.

Смежные вопросы