如何针对某些操作在PostgreSQL中使用范围最佳地索引表?

如何解决如何针对某些操作在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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?