Самый эффективный способ получить уникальный список ключей из всех строк hstore?

Для простоты предположим, что у меня есть таблица с одним столбцом, который является просто хранилищем. Каков наиболее эффективный способ получить уникальный список всех ключей из всех строк hstore?

eg.

my_hstore
------------
a=>1,b=>2
b=>2,c=>3
x=>10,y=>11
y=>11,z=12

Каков наиболее эффективный способ получить список/массив/набор, содержащий (a,b,c,x,y,z)?


person jay.lee    schedule 18.08.2012    source источник


Ответы (1)


Всегда есть прямой подход skeys:

select distinct k
from (
    select skeys(my_hstore) as k
    from your_table
) as dt

А если вам нужен массив, добавьте array_agg :

select array_agg(distinct k)
from (
    select skeys(my_hstore) as k
    from your_table
) as dt
person mu is too short    schedule 18.08.2012
comment
Спасибо, это работает. Это, безусловно, быстро, но является ли оно наиболее эффективным, если не переборщить и не стать чрезмерно сложным? Есть ли какие-либо индексы, которые я мог бы добавить, чтобы ускорить такие запросы? - person jay.lee; 18.08.2012
comment
Глядя на документы, я не увидел ссылки на тот факт, что ключи hstore будут проиндексированы (и это имеет смысл, поскольку hstore должен быть универсальным контейнером, а не иметь те же функции, что и индексированная таблица) . Поэтому я думаю, что приведенный выше запрос является наиболее эффективным. - person aymeric; 18.08.2012
comment
Столбец hstore можно индексировать с помощью GiST (и, возможно, GIN, я не уверен), но я не вижу, чтобы такой индекс мог быть полезен для этого конкретного запроса. Поиск определенных пар ключ/значение будет быстрее с индексом, если у вас очень много строк в таблице. В общем, индексация не помогает в таблицах, в которых все данные умещаются на одной-двух страницах. - person kgrittn; 18.08.2012
comment
@kgrittn: Есть идеи, как это сделать, чтобы не было сканирования таблицы? Я предполагаю, что у вас могла бы быть таблица кэша (key,n) и несколько триггеров для обслуживания счетчиков (n) и удаления строк таблицы кэша при n = 0, но это может быть слишком сложным механизмом. - person mu is too short; 18.08.2012
comment
@muistooshort: я не рассматриваю любые альтернативы, чтобы избежать сканирования таблицы, которое проще, чем такие триггеры. - person kgrittn; 19.08.2012
comment
Я думаю, что select distinct skeys(my_hstore) from my_table работает - person hasen; 23.05.2017
comment
@hasen Да, это работает (sqlfiddle.com/#!15/ede4f/3 ), но я не уверен, как получить массив без производной таблицы (при условии, что им нужен массив). Возможно, стоит преобразовать этот комментарий в ответ. - person mu is too short; 23.05.2017
comment
@muistooshort извините за путаницу, мой комментарий не был ответом на ваш вопрос. Просто общий комментарий к ответу, так как он показался немного подробным. - person hasen; 23.05.2017
comment
@hasen Но подход select distinct k слишком многословен, так что вреда не будет. - person mu is too short; 23.05.2017