Postgres Функциональный индекс для string_to_array (long_string, ',') не используется - PullRequest
0 голосов
/ 25 февраля 2020

Я имею дело с ~ 20M строкой таблицы в Postgres 10.9, в которой есть текстовый столбец, представляющий собой набор строк, разделенных запятыми. Эта таблица объединяется во многие таблицы, которые намного длиннее, и каждый раз, когда предыдущие авторы так делали, они объединяются с предложением on, равным some_other_string = Any(string_to_array(col, ',')) Я пытаюсь реализовать быструю оптимизацию, чтобы запросы выполнялись быстрее, пока я работаю над лучшее решение со следующим индексом:

Мой функциональный индекс: create index string_to_array_index on happy_table (string_to_array(col));

Тестовый запрос: select string_to_array(col, ',') from happy_table;

Когда я выполняю объяснение тестового запроса по порядку чтобы увидеть, используется ли индекс, я вижу, что это не так. Я вижу примеры функциональных индексов в строках, где они строчные или строчные или выполняют некоторые базовые операции c, как это. Работают ли функциональные индексы с string_to_array?

select a.id
from joyful_table a
  join happy_table b on a.col = any(string_to_array(b.col, ','));

1 Ответ

2 голосов
/ 25 февраля 2020

Это плохой дизайн. Независимо от того, что вы делаете и какой размер таблицы, вы застряли с вложенным соединением l oop (потому что условие объединения не использует оператор =).

Вы правы; лучшее, что вы можете сделать, - это ускорить этот вложенный l oop с помощью индекса.

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

CREATE INDEX ON happy_table USING gin (string_to_array(col, ','));

Но этот индекс не будет использоваться с = ANY. Вам придется переписать объединение на

SELECT a.id
FROM joyful_table a
   JOIN happy_table b
      ON ARRAY[a.col] <@ string_to_array(b.col, ',');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...