2 つのテーブル と がtbl_a
ありtbl_b
、どちらも ORC としてフォーマットされ、列 で分割されていますdt
。一方のテーブルはパーティション形式を使用し%Y%m%d%H%M
、もう一方のテーブルは を使用しています%Y%m%d
。
Hive 1.2.1.2.4 (TEZ 0.7.0.2.4 を使用) での単純な SELECT + WHERE ステートメントの実行計画を見ると、 の述語フィルター セットのみが表示されtbl_a
、他の は表示されませんtbl_b
。これは、tbl_b
目的のパーティションに対するスキャンだけでなく、完全なテーブル スキャンが実行されることを意味します。照会された両方のパーティションが存在し、データが含まれています。
hive> EXPLAIN SELECT * FROM tbl_a WHERE dt='1001010600';
OK
Plan not optimized by CBO.
Stage-0
Fetch Operator
limit:-1
Select Operator [SEL_2]
outputColumnNames:["_col0","_col1","_col2","_col3"]
Filter Operator [FIL_4]
predicate:(dt = '1001010600') (type: boolean)
TableScan [TS_0]
alias:tbl_a
Time taken: 0.866 seconds, Fetched: 12 row(s)
hive> EXPLAIN SELECT * FROM tbl_b WHERE dt='161001';
OK
Plan not optimized by CBO.
Stage-0
Fetch Operator
limit:-1
Select Operator [SEL_2]
outputColumnNames:["_col0","_col1","_col2","_col3"]
TableScan [TS_0]
alias:tbl_b
Time taken: 0.904 seconds, Fetched: 10 row(s)
この動作は私にはあまり明確ではありません。where 条件を述語フィルターとして使用するかどうかを決定する基準はどれですか?