【发布时间】:2021-06-23 15:19:35
【问题描述】:
拥有 RDS Postgresql 12.5 并处理带有 JSONB 列 (metadata) 的表 (app_events),JSON 数据可能会因事件名称而异,请参阅下面的结构。
CREATE TABLE IF NOT EXISTS "public".app_events (
id uuid DEFAULT uuid_generate_v4() NOT NULL,
event_id text NOT NULL,
name text NOT NULL,
creation_time timestamp without time zone NOT NULL,
creation_time_in_milliseconds bigint NOT NULL,
metadata jsonb NOT NULL,
PRIMARY KEY(id)
);
event_id 和 name 上有默认索引 (btree)。
基于name 列,我们创建视图以将 JSON 中的数据标准化为表格格式,示例如下。
CREATE OR REPLACE VIEW "public".charity_created AS
SELECT app_events.id,
app_events.event_id,
app_events.name,
app_events.creation_time,
date(app_events.creation_time) AS created_date,
(app_events.metadata ->> 'aggregateId'::text) AS user_id,
(app_events.metadata ->> 'url'::text) AS url,
(app_events.metadata ->> 'name'::text) AS charity_name,
(app_events.metadata ->> 'about'::text) AS charity_about,
(app_events.metadata ->> 'country'::text) AS country,
(app_events.metadata ->> 'category'::text) AS category,
(app_events.metadata ->> 'currencyCode'::text) AS currencycode,
(app_events.metadata ->> 'isPayItForwardPartner'::text) AS is_pay_it_forward_partner,
(app_events.metadata ->> 'isCampaignDonationPartner'::text) AS is_campaign_donation_partner
FROM public.app_events
WHERE (app_events.name = 'CharityCreated'::text)
ORDER BY (date(app_events.creation_time)) DESC;
现在您可以运行如下查询。
SELECT *
FROM "public".charity_created
WHERE charity_name == 'some_charity_name'
此外,我们在视图之间创建连接或联合,并开始注意到读取/查询的延迟有时长达一小时,没有超时,但返回数据可能具有挑战性,这对我们的报告团队来说绝对是一个巨大的打击。
我正在寻找的问题和知识是,我可以在哪里创建(或应该创建)索引以改善读取延迟;到目前为止有两个发现进行辩论。
- 在实际的 JSONB 列 (
metadata) 上没有意义,因此也许一种解决方案是开始根据每个事件名称的特定架构创建索引,例如 this answer - 创建
materialized views并付出代价刷新数据副本(每晚),同时在物化视图上创建索引,类似于this answer - 也许保留
views并在这些上创建索引
【问题讨论】:
标签: postgresql indexing jsonb materialized-views