以下提供的sql,以及报错信息中的IP、端口、PID均为称述本问题的测试样例。
详细报错:
psql:test.sql:1: ERROR: function cannot execute on a QE slice because it accesses relation "demo_gp_table" (seg1 slice1 000.000.000.00:00000 pid=1234567)
CONTEXT: SQL statement "select field2 into field from demo_gp_table
where field1 = param"
PL/pgSQL function demo_gp_func (character varying) line 1 at SQL statement
ANALYZE
问题原因:
GP数据库中,函数demo_gp_func在查询切片(QE slice)上访问了一个无法在该查询切片上直接访问的数据表demo_gp_table。并且该报错信息提供了发生错误的查询切片的详细信息,包罗它所在的段(seg1),切片编号(slice1),服务器的IP和端口,以及进程ID。
注:环境中QE slice信息查询,先切admin用户su gpadmin,gpstate -s查询详细信息。
sql样例:
(1)被调用方sql,数据表创建。
- drop table if exists demo_gp_table;
- create table demo_gp_table (
- field1 varchar(16),
- field2 integer
- ) distributed by (field1);
- insert into demo_gp_table (field1,field2) values ('field1', 2);
复制代码 (2)函数sql。
- drop function demo_gp_func (param varchar(16));
- create or replace function demo_gp_func (param varchar(16))
- returns int
- as $$
- declare field decimal(10, 2);
- begin
- select field2 into field from demo_gp_table
- where field1 = param;
-
- if field > 1 then
- return 11111111;
- else
- return 0;
- end if;
- end;
- $$ language plpgsql;
复制代码 (3)调用方sql。
- select demo_gp_func('field1') as test_field;
复制代码
一、媒介
1、GP数据库介绍。
Greenplum数据库是一种基于开源PostgreSQL数据库的先辈的大规模并行处置惩罚(MPP)数据库管理体系。它专为处置惩罚大规模数据集而设计,非常得当于数据堆栈、大规模数据分析和贸易智能应用。以下是Greenplum数据库的详细介绍:
核心特性
(1)大规模并行处置惩罚(MPP):Greenplum数据库采取MPP架构,通过将数据分布在多个服务器节点上并行处置惩罚,实现了高速查询和数据分析。
(2)数据压缩:Greenplum数据库支持高效的数据压缩技能,可以显著镌汰存储需求并提高I/O效率。
(3)列式存储:除了传统的行式存储,Greenplum还支持列式存储,这对于分析查询特殊有利,因为它可以大大镌汰必要读取的数据量。
(4)事务处置惩罚:作为一个基于PostgreSQL的数据库,Greenplum支持完备的ACID事务处置惩罚。
(5)容错和高可用性:Greenplum数据库支持数据冗余和自动故障转移,确保了体系的高可用性。
架构
(1)Master节点:控制查询的分配和实行,并协调所有Segment节点。Master节点还存储体系目录和元数据。
(2)Segment节点:存储现实的数据,并实行查询的并行部分。每个Segment拥有数据的一部分,所有Segment共同构成完备的数据集。
使用场景
(1)数据堆栈:用于存储大量汗青数据,支持复杂的查询和分析。
贸易智能(BI):支持实时和批量的报告生成,资助用户做出数据驱动的决策。
(2)大数据分析:适用于处置惩罚PB级别的大数据集,举行复杂的数据挖掘和分析。
主要优势
(1)高性能:通过并行处置惩罚和优化查询,Greenplum能够快速处置惩罚大量数据。
(2)可扩展性:可以轻松添加更多的Segment节点来扩展体系的处置惩罚本领和存储容量。
(3)本钱效益:基于开源技能,Greenplum提供了相对较低的总拥有本钱。
管理和监控
Greenplum数据库提供了管理和监控工具,如Greenplum Command Center,用于监控体系性能、实行管理任务和优化查询。
2、关于QE slice上无法访问数据表的问题。
现在仅辨认到函数访问数据表有问题,sql调用数据表正常。
(1)函数访问:在Greenplum数据库中定义一个函数并实行它时,数据库大概必要在所有切片(segments)上实行这个函数。假如函数中包含的查询必要跨切片访问数据(即数据不在同一个切片上),Greenplum会尝试实行数据移动(Motion操作)来满足查询需求。假如这种数据移动不被允许或不能实行,就会导致错误(本篇报错)。
(2)SQL调用:直接实行SQL语句时,数据库优化器可以更好地控制查询的实行计划。它大概会决定在主节点master上实行整个查询,大概只在一个或几个切片上实行,从而避免了跨切片的数据移动。此外,优化器大概会选择不同的实行路径,如使用哈希聚合而不是排序聚合,这大概导致不必要跨切片数据移动。
二、办理方案
1、分布式复制计谋。
创建数据表demo_gp_table,插入数据后,实行分布式复制计谋,将此数据表分别复制到所有segment上,使得无论函数位于哪个segment,都可调用数据表。
- alter table demo_gp_table set distributed replicated;
复制代码 (1)数据匀称分布:由于每个节点都拥有完备的表数据,因此查询时不必要举行数据重分布,这对于小表或经常必要全表扫描的表来说大概是有益的。
(2)存储空间:这种计谋会增长存储需求,因为每个节点都会存储表的所有数据。
(3)数据更新:对复制表的更新操作必要在所有节点上实行,大概会增长写入操作的复杂性和时间。
综上,分布式复制计谋仅适用于小表或必要频繁举行全表扫描的表,对于而对于大表或写入操作频繁的表,大概会增长写入操作的复杂性和时间,应该采取以下方案。
2、使函数在主节点master上实行。
将函数demo_gp_func声明到master上实行,此处存有数据库的元数据,使得函数调用不会报错。
- drop function demo_gp_func (param varchar(16));
- create or replace function demo_gp_func (param varchar(16))
- returns int
- as $$
- declare field decimal(10, 2);
- begin
- select field2 into field from demo_gp_table
- where field1 = param;
-
- if field > 1 then
- return 11111111;
- else
- return 0;
- end if;
- end;
- $$ language plpgsql
- execute on master;
复制代码 (1)体系管理:Master节点负责整个Greenplum数据库体系的管理。它处置惩罚所有的外部毗连,并协调所有的数据库操作。
(2)查询剖析和优化:当客户端提交查询时,Master节点负责剖析SQL语句,生成查询计划,并将查询计划优化后发送到各个Segment节点实行。
(3)元数据管理:Master节点存储数据库的元数据,包罗表和索引的定义、权限信息、体系设置参数等。
(4)事务管理:Master节点负责事务的协调,确保分布式事务的原子性和一致性。
(5)数据分发:在创建表或插入数据时,Master节点会根据表的分布计谋将数据行分发到相应的Segment节点。
三、总结
在项目中遇到的这个问题,关于GP数据库其他特性尚有待挖掘。对于此问题,由于我使用的数据表数据量小,所以采取了分布式复制计谋,办理了此问题。在复现此问题时,原来想着写个shell脚本调用sql,但是sql实行每次都在主节点master上,导致问题无法复现,并且数据库的segment不能毗连,只能拿出原本项目代码找多节点测试环境举行复现,并验证办理方案,然后用样例整理文档。感叹有时间复现问题比办理问题更难。
简单小记,相互学习!
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |