全部产品
分析型数据库

4.2 逻辑表达式和特殊语法

更新时间:2017-06-07 13:26:11   分享:   

表Join的条件

为了更高效的进行表关联,分析型数据库对表关联操作在分析型数据库中,两个事实表进行Join的充要条件是:(1)这两个表在一个表组;(2)这两个表的Join Key是Hash分区列;(3)两张表的Hash分区数必须一致,否则Join结果不准确;(4)两张表的Join Key至少有一列建立了HashMap索引,推荐建立在数据量较小的一侧。

维度表参与的关联,只需要符合上述的(4)一点即可。

逻辑表达式

在分析型数据库中对逻辑表达式的支持如下:

  • NOT a:如果表达式(a)是0则返回1,非0则返回0NULL则返回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 01
  • NOT 50
  • NOT NULLNULL
  • NOT a:根据表达式(a)的取值决定
  • ! 01
  • ! 50
  • ! NULLNULL
  • ! a:根据表达式(a)的取值决定
  • 1 && 51
  • 1 && 00
  • 5 && 00
  • NULL && 00
  • NULL && NULLNULL
  • NULL && 5NULL
  • a && b:根据表达式(a)和表达式(b)的取值决定
  • a AND b:同上
  • 0 || 00
  • 1 || 51
  • NULL || 11
  • NULL || 51
  • NULL || 00
  • NULL || NULLNULL
  • 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版本及先前版本,子查询使用有所限制,例如:

  1. select count(*) from (
  2. select a from tbl group by a
  3. ) tmp;
  4. -- a不是一级分区列时结果不准确,当group by a 返回结果不超过10000条时,可以临时使用:
  5. select udf_sys_rowcount(*) from (
  6. select a from tbl group by a
  7. ) tmp;
  1. select a, cnt from (
  2. select a,count(b) as cnt from tbl group by a
  3. ) tmp;
  4. -- a,b均不是一级分区列时结果不准确,可以临时使用:
  5. select a, sum(cnt) from (
  6. select a,count(b) as cnt from tbl group by a
  7. ) tmp group by a;

0.9版本的Full MPP Mode支持上述SQL的正确运行,详见4.4节

本文导读目录
本文导读目录
以上内容是否对您有帮助?