postgres查询多表/分区表/动态表中的数据量

最近被派了个活,要整一个postgres存储过程的脚本,然而本人并不会玩postgres,而且也没接触过存储过程,这几天不知道走了踩了多少坑。

由于数据量比较大,故需要分区处理。在成功对原表进行散列分区并存入测试数据之后,领导说验证一下分区表数据条数与输入的测试数据条数是否一致,于是要查询分区表的数据条数

由于分区表的个数较多,不想一个个手动输入再查找,于是采用存储过程动态拼接分区表名并进行查询。

第一个坑:静态执行select无法使用拼接的表名
create or replace function get_line_number(table_name_t varchar) returns integer as $$
declare
    line_number integer;
begin
	-- 【注意】以下为错误代码
	---------------------------------------错误代码分隔符---------------------------------------
	-- 假设你传入的传入的表名是'ABCD',那么下面这句话并不是操作表'ABCD',而是操作表名为'table_name_t'的表!!
	-- 所以执行select count(*)的时候想用动态表名就只能够使用动态写法
    select count(*) into line_number from table_name_t;
    ---------------------------------------错误代码分隔符---------------------------------------
    return line_number;
end;
$$ language plpgsql;
第二个坑:动态执行不能传入局部变量
create or replace function get_line_number(table_name_t varchar) returns integer as $$
declare
    line_number integer;
begin
	-- 【注意】以下为错误代码
	---------------------------------------错误代码分隔符---------------------------------------
	-- 这种写法并不能将查询结果存入line_number,基本是执行错误的节奏
    execute 'select into line_number count(*) from ' || table_name_t;
    ---------------------------------------错误代码分隔符---------------------------------------
    return line_number;
end;
$$ language plpgsql;
正确写法
create or replace function get_line_number(table_name_t varchar) returns integer
as
$$
declare
    line_number integer;
begin
	-- 只用把上一步的into移到外面来就行了,(鬼知道这一步我卡了多久,中间还用了临时表插入再查询什么的就不说了...)
    execute 'select count(*) from ' || table_name_t into line_number;
    return line_number;
end;
$$ language plpgsql;
PostgreSQL使用基于约束的分区来实现分区表,它是通过使用约束来实现分区的,每个分区都有一个唯一约束来限制分区键的范围。在查询时,PostgreSQL会将查询转化为对特定分区的查询,以提高查询效率。 在底层实现方面,PostgreSQL使用了一个称为“继承”的机制来实现分区表。继承是一种将属性从一个表传递到另一个表的机制。在继承关系中,子表继承了父表的属性,并且可以添加自己的属性。 在分区表中,每个分区都是一个子表,它继承了父表的所有属性,并且添加了自己的约束。当我们向分区表中插入数据时,PostgreSQL会根据数据的分区键值,将数据插入到相应的分区子表中。当我们查询分区表时,PostgreSQL会将查询转化为对特定的分区子表的查询,以提高查询效率。 例如,我们可以创建一个分区表sales,它是按照销售日期进行分区的,每个分区子表都继承了sales表的所有属性,并且添加了自己的约束。当我们插入数据时,PostgreSQL会根据数据的销售日期,将数据插入到相应的分区子表中。当我们查询数据时,PostgreSQL会将查询转化为对特定的分区子表的查询,以提高查询效率。 下面是一个示例,演示分区表的底层实现: ``` CREATE TABLE sales ( sale_id bigint, sale_date date, sale_amount numeric ); CREATE TABLE sales_q1_2020 ( CONSTRAINT sales_q1_2020_check CHECK (sale_date >= '2020-01-01' AND sale_date < '2020-04-01') ) INHERITS (sales); CREATE TABLE sales_q2_2020 ( CONSTRAINT sales_q2_2020_check CHECK (sale_date >= '2020-04-01' AND sale_date < '2020-07-01') ) INHERITS (sales); CREATE TABLE sales_q3_2020 ( CONSTRAINT sales_q3_2020_check CHECK (sale_date >= '2020-07-01' AND sale_date < '2020-10-01') ) INHERITS (sales); CREATE TABLE sales_q4_2020 ( CONSTRAINT sales_q4_2020_check CHECK (sale_date >= '2020-10-01' AND sale_date < '2021-01-01') ) INHERITS (sales); ``` 在这个示例中,我们创建了一个父表sales和四个子表,每个子表都继承了sales表的所有属性,并且添加了自己的约束。当我们向sales表中插入数据时,PostgreSQL会根据数据的销售日期,将数据插入到相应的分区子表中。当我们查询数据时,PostgreSQL会将查询转化为对特定的分区子表的查询,以提高查询效率。 总的来说,分区表的底层实现使用了继承机制来实现分区表的分区和查询优化。这种机制可以有效地组织和管理大量的数据,提高查询效率和可扩展性。但是需要注意的是,使用分区表也会带来一些额外的管理和维护的负担。需要在权衡利弊之后,谨慎选择是否使用分区表
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值