如何解决如何针对某些操作在PostgreSQL中使用范围最佳地索引表?
我有一个批处理作业系统,在该系统中,作业可能会对数据进行分割(在一组切片中),而其他作业可能会根据输出的类型触发,它们本身可能会生成子分区,并且我想跟踪所有最终输出的时间为给定类型的输出生成的数据会覆盖整个数据集,以触发作业收集该输出类型的所有数据。触发器自动在数据库中自动将指定片段的范围合并在一起,并且当最终对于输出类型而言,在分区之前存在与原始数据匹配的完整范围时,我知道要为该输出类型启动收集类型的作业。在数据库中,表示如下:
create table outputranges (
jobgroupid uuid not null references jobgroups,iotypeid smallint references iotypes,slices int4range not null,exclude using gist(jobgroupid with =,iotypeid with =,slices with &&));
create aggregate sum(anyrange) (
stype = anyrange,sfunc = range_union
);
create or replace function mergeadjacent()
returns trigger as $$
begin
with matching as (
delete from outputranges
where outputranges.jobgroupid = new.jobgroupid
and outputranges.iotypeid = new.iotypeid
and (outputranges.slices -|- new.slices)
returning slices
)
select into new.slices (
select sum(slices) from (
select new.slices
union all
select slices from matching
) _all
);
return new;
end;
$$ language 'plpgsql' strict;
create trigger output_range_updating
before insert or update on outputranges
for each row execute function mergeadjacent();
我想知道如何最佳索引以针对两个常见操作进行优化。生成类型的输出时,开始切片和结束切片是已知的,并且将一行插入到输出范围中,从而运行上述功能。另外,我需要检查给定作业组和类型的范围是否与指定完整数据集的范围相匹配(我可以在触发函数的末尾添加该检查,并在另一个表中写入true / false,而不是搜索输出范围中的jobgroupid + dataset匹配条目,因为触发器已经必须找到它)。是否应该将jobgroupid + dataset作为复合主键?触发功能是否先搜索那些,然后检查范围邻接?还是对所有三列都执行此操作,因此将已经存在的索引用于排除约束?另外,在触发器中进行排除检查会比作为自己的事情更有效吗?最后,包装的最佳色谱柱顺序是什么?范围是基本类型的2倍吗?我应该将范围放在uuid和smallint之间而不是在末尾吗?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。