Поддерживает ли SQL в YugaByte атрибуты индекса в столбце JSONB? - PullRequest
0 голосов
/ 15 июня 2019

Я искал атрибуты индекса внутри столбца JSONB, но не смог найти это в документации.

1 Ответ

0 голосов
/ 17 июня 2019

Да, это поддерживается, я добавляю пример встроенного здесь. Но, к сожалению, мы, похоже, еще не зафиксировали это. Не могли бы вы открыть проблему GitHub против нас? https://github.com/YugaByte/yugabyte-db

Я установил YB на свой компьютер и использовал ysqlsh для подключения к нему (вы также можете использовать psql), прежде чем выполнить следующее.

1. Создать таблицу с JSONB столбцом

postgres=# CREATE TABLE orders (
                ID serial NOT NULL PRIMARY KEY,
                info json NOT NULL
                );

CREATE TABLE
Time: 1706.060 ms (00:01.706)

2. Создать индекс по атрибуту JSONB

postgres=# CREATE INDEX ON orders((info->'items'->>'product'));

CREATE INDEX
Time: 519.093 ms

Описание таблицы теперь должно показывать индексы:

postgres=# \d+ orders;
                                                Table "public.orders"
 Column |  Type   | Collation | Nullable |              Default               | Storage  | Stats target | Description
--------+---------+-----------+----------+------------------------------------+----------+--------------+-------------
 id     | integer |           | not null | nextval('orders_id_seq'::regclass) | plain    |              |
 info   | json    |           | not null |                                    | extended |              |
Indexes:
    "orders_pkey" PRIMARY KEY, lsm (id HASH)
    "orders_expr_idx" lsm (((info -> 'items'::text) ->> 'product'::text) HASH)

Обратите внимание на наличие следующей строки, которая показывает индекс: "orders_expr_idx" lsm (((info -> 'items'::text) ->> 'product'::text) HASH)

3. Введите некоторые данные

postgres=# INSERT INTO orders (info)
  VALUES
  ('{ "customer": "John Doe", "items": {"product": "Beer"  ,"qty": 6}}'),
  ('{ "customer": "Lily Bush", "items": {"product": "Diaper","qty": 24}}'),
  ('{ "customer": "Josh William", "items": {"product": "Toy Car","qty": 1}}'),
  ('{ "customer": "Mary Clark", "items": {"product": "Toy Train","qty": 2}}')
  );

4. Запрос с планом объяснения

postgres=# EXPLAIN SELECT * from orders WHERE info->'items'->>'product'='Beer';

                                  QUERY PLAN
-------------------------------------------------------------------------------
 Index Scan using orders_expr_idx on orders  (cost=0.00..4.12 rows=1 width=36)
   Index Cond: (((info -> 'items'::text) ->> 'product'::text) = 'Beer'::text)
(2 rows)

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

...