525
阿里云
4.2 逻辑表达式和特殊语法__第四章 DML_使用手册_分析型数据库-阿里云
表Join的条件
为了更高效的进行表关联,分析型数据库对表关联操作在分析型数据库中,两个事实表进行Join的充要条件是:(1)这两个表在一个表组;(2)这两个表的Join Key是Hash分区列;(3)两张表的Hash分区数必须一致,否则Join结果不准确;(4)两张表的Join Key至少有一列建立了HashMap索引,推荐建立在数据量较小的一侧。
维度表参与的关联,只需要符合上述的(4)一点即可。
逻辑表达式
在分析型数据库中对逻辑表达式的支持如下:
NOT a
:如果表达式(a
)是0
则返回1
,非0
则返回0
,NULL
则返回NULL
!a
:同上a && b
:如果表达式(a
)和(b
)都不是NULL
且都非0
则返回1
,如果其中有一个是0
则返回0
,否则返回NULL
a || b
:如果表达式(a
)和(b
)都是0
是返回0
否则如果都不是NULL
则返回1
,如果其中有一个为NULL
则另外一个是0
则返回0
,非0
则返回1
,如果都是NULL
则返回NULL
例如:
NOT 0
:1
NOT 5
:0
NOT NULL
:NULL
NOT a
:根据表达式(a
)的取值决定! 0
:1
! 5
:0
! NULL
:NULL
! a
:根据表达式(a
)的取值决定1 && 5
:1
1 && 0
:0
5 && 0
:0
NULL && 0
:0
NULL && NULL
:NULL
NULL && 5
:NULL
a && b
:根据表达式(a
)和表达式(b
)的取值决定a AND b
:同上0 || 0
:0
1 || 5
:1
NULL || 1
:1
NULL || 5
:1
NULL || 0
:0
NULL || NULL
:NULL
a || b
:根据表达式(a
)和表达式(b
)的取值决定a OR b
:同上
多值列的用法和限制
在分析型数据库中,多值列这个数据类型有其特殊的用法和限制。对于多值列,不允许在不经由WHERE子句中用IN/CONTAINS进行枚举筛选的情况信下直接在SELECT/GROUP BY中使用。
例如:
SELECT m, COUNT(a) FROM A WHERE m IN('foo', 'bar') GROUP BY m
, m为多值列,这种情况下可支持。SELECT m FROM A limit 10
, m为多值列时不支持SELECT m, COUNT(a) FROM A GROUP BY m
,m为多值列时不支持
另外,由于多值列的数据结构的特殊性,在对含有多值列的行按照多值列进行分组时,多值列的每一个单值会等价于产生一个新的行,计算count/sum等聚合函数的结果可能会被多次计算。
例如原始数据如下:
a | m |
---|---|
0 | ‘bar’ |
1 | ‘foo’, ‘bar’ |
2 | ‘foo’, ‘bar’, ‘oh’ |
在此之上执行 SELECT m, COUNT(a) FROM A WHERE m IN('foo', 'bar') GROUP BY m
的结果:
m | COUNT(a) |
---|---|
‘foo’ | 2 |
‘bar’ | 3 |
‘oh’ | 1 |
非分区列的使用限制
分析型数据库作为分布式实时OLAP系统,其数据根据分区列分布在不同的物理服务器中,所以在一些特殊的情况下,分区列和非分区列的使用上有所不同。
count(distinct cor_expr)
中cor_expr必须是分区列或分区列衍生的列,否则不能和group by连用SELECT distinct cor_expr...
中若cor_expr不是分区列或分区列衍生的列,则结果可能不精确- TOP-N计算(order by expr limit 100 ),若是同时和非分区列的GROUP BY子句连用,结果可能不精确
0.9版本的Full MPP Mode支持上述SQL的正确运行,详见4.4节
子查询使用限制
分析型数据库中,0.8版本及先前版本,子查询使用有所限制,例如:
select count(*) from (
select a from tbl group by a
) tmp;
-- a不是一级分区列时结果不准确,当group by a 返回结果不超过10000条时,可以临时使用:
select udf_sys_rowcount(*) from (
select a from tbl group by a
) tmp;
select a, cnt from (
select a,count(b) as cnt from tbl group by a
) tmp;
-- a,b均不是一级分区列时结果不准确,可以临时使用:
select a, sum(cnt) from (
select a,count(b) as cnt from tbl group by a
) tmp group by a;
0.9版本的Full MPP Mode支持上述SQL的正确运行,详见4.4节
最后更新:2016-11-23 16:03:54
上一篇:
4.1 Select语句基本语法__第四章 DML_使用手册_分析型数据库-阿里云
下一篇:
4.3 INSERT/DELETE命令__第四章 DML_使用手册_分析型数据库-阿里云
常见错误说明__附录_大数据计算服务-阿里云
发送短信接口__API使用手册_短信服务-阿里云
接口文档__Android_安全组件教程_移动安全-阿里云
运营商错误码(联通)__常见问题_短信服务-阿里云
设置短信模板__使用手册_短信服务-阿里云
OSS 权限问题及排查__常见错误及排除_最佳实践_对象存储 OSS-阿里云
消息通知__操作指南_批量计算-阿里云
设备端快速接入(MQTT)__快速开始_阿里云物联网套件-阿里云
查询API调用流量数据__API管理相关接口_API_API 网关-阿里云
使用STS访问__JavaScript-SDK_SDK 参考_对象存储 OSS-阿里云