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-阿裏雲