閱讀525 返回首頁    go 阿裏雲


4.2 邏輯表達式和特殊語法__第四章 DML_使用手冊_分析型數據庫-阿裏雲

表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節

最後更新:2016-11-23 16:03:54

  上一篇:go 4.1 Select語句基本語法__第四章 DML_使用手冊_分析型數據庫-阿裏雲
  下一篇:go 4.3 INSERT/DELETE命令__第四章 DML_使用手冊_分析型數據庫-阿裏雲