环境:使用dm8.1在kylinserver10上搭建了DMMPP主备系统,总计4个节点,关系如下:

本次在7236上建立会话(全局登录),创建了随机分布表V1并插入了数据:
CREATE TABLE "SYSDBA"."V1"
(
"ID" INT,
"NAME" VARCHAR(20) NOT NULL) STORAGE(ON "MAIN", CLUSTERBTR)
DISTRIBUTED RANDOMLY;

1.查看查询数据时是否只查询本节点
select sf_get_session_mpp_select_local();--0表示查询全部数据,1表示查询本节点数据
2.设置是否只查询本地数据
call sp_set_session_mpp_select_local(0);--0表示查询全部数据,1表示查询本节点数据
3.本地登录是否允许ddl
call sp_set_session_local_type(0);
--是否允许当前本地会话执行ddl操作,1表示允许,0表示不允许。这个操作需要以mpp本地方式登录。全局连接无法执行此操作。
4.获取本地会话的站点号
select sf_get_self_ep_seqno();--获取本次会话的站点号
这里我们的结果是0,0号站点是端口号7236的节点。
5.统计mpp环境下表在各个站点的数据行数
call sp_get_ep_count('SYSDBA','V1');---参数分别为模式名和表名
这里我们的执行结果是:

也就是V1表有8行数据,其中6行存储在了站点0也就是端口号为7236的节点上;另2行存储在了站点1也就是端口号7238的节点上。
6.查询某条数据来自哪个站点
sf_get_ep_seqno(rowid);
这里我们先查一下V1表的rowid:
select id,rowid from V1;

看一下rowid对应的站点号:
select sf_get_ep_seqno(288230376151711745) ;

select sf_get_ep_seqno(1) ;

这里假如我们执行:
select sf_get_ep_seqno(1) from V1 where id =1001;
select sf_get_ep_seqno(1) from V1 where id =1002;
结果会如何呢?从rowid来看,rowid=1指向的是id=1001这条数据,上面这个语句会怎么过滤呢?返回的站点号对应的到底是rowid对应的数据还是where id =10021指向的数据行呢?
假如执行
select sf_get_ep_seqno(1) from V1;
又会如何呢?
实际执行结果如下:




这里可以看出两点:
1)select sf_get_ep_seqno(1) from V1 where id =1001;它的执行结果跟表V1里面id =1001对应的数据完全无关,sf_get_ep_seqno(1) from V1的结果就是rowid =1的数据 的站点号0,这个句子的执行结果完全等同于select 0 from V1 where id = 1002
2)rowid对应的表也可以不指定。理论上不指定表时select sf_get_ep_seqno(n) ;应该返回所有rowid=n的站点号。实际上实测之后发现rowid<k时,数据分布在站点0上,rowid>=k时,数据分布在站点1上,这里不论对哪个表都成立。在本次实验环境中,k=288230376151711744
这个结论对系统表也是适用的。
例如:select instance_name,rowid from v$instance;

下面我们在hash分布表里应用一下sf_get_ep_seqno(rowid);
create table R3(gid int,gname varchar(20))
distributed by hash (gname) ;
insert into R3 values (62,'liugang'),(121,'zhaorui'),(231,'huge');
insert into R3 values (64,'duke'),(65,'jiangjun'),(66,'zifeng');
commit;
select sf_get_ep_seqno(rowid = (select rowid from R3 where gid = 231)) as EPNO;
