【发布时间】:2021-07-31 21:48:09
【问题描述】:
我有这个问题:
select
"time_interval",
SUM("mv"."percent_ampl_bought") as "percent_ampl_bought",
SUM("mv"."percent_ampl_sold") as "percent_ampl_sold",
SUM("mv"."percent_ampl_transferred") as "percent_ampl_transferred",
SUM("mv"."amount_ampl_bought") as "amount_ampl_bought",
SUM("mv"."amount_ampl_sold") as "amount_ampl_sold",
SUM("mv"."amount_ampl_transferred") as "amount_ampl_transferred"
from "mv_30day_daily_aggregate_buys_sells_transfers" as "mv"
group by grouping sets ( (time_interval), () )
order by time_interval desc nulls last;
有了这个解释计划:
https://explain.depesz.com/s/gJXC
我有这些索引:
CREATE UNIQUE INDEX mv_30day_daily_aggregate_buys_sells_transfers_primary
ON public.mv_30day_daily_aggregate_buys_sells_transfers USING btree
(time_interval, contract_address);
CREATE INDEX mv_30day_daily_aggregate_buys_sells_transfers_time_interval
ON public.mv_30day_daily_aggregate_buys_sells_transfers USING btree
(time_interval);
CREATE INDEX v_30day_daily_aggregate_buys_sells_transfers_contract_address
ON public.mv_30day_daily_aggregate_buys_sells_transfers USING btree
(contract_address)
是否可以进一步优化?这张表只有 30 个时间间隔,所以我觉得我应该能够更快地获得它。
【问题讨论】:
-
能否将表名(或表别名)添加到该行的列中:
where address = addresses.contract_address and tag_id = 3? -
您加入
addresses表是为了检查地址是否存在?还是只是为了方便address_tags中的NOT EXISTS()?如果是后者,我看你根本不需要那个加入? (NOT EXISTS()只能引用mv.contract_address?) -
另外,请在所有列前加上表别名。您可能很清楚每列的来源,但它不适合我们。
-
我将从添加索引开始:
create index ix1 on address_tags (tag_id, address); -
我添加了别名并简化查询我删除了连接并更新了解释计划(稍后当我限制返回给顶级持有者的地址时需要连接但它没有太大影响关于性能,所以暂时将其删除)。地址标签和地址具有正确的索引。
标签: sql postgresql performance query-optimization