explain Select A .col1, A .col2, A .col3 From A _ table A
left semi join B _ table B on A . id = b . id
Where A . rq =2020-01-01;
rq是分区字段
不知道你这个问题是否已经解决, 如果还没有解决的话:答案: 可以通过以下步骤来判断Hive查询是否进行了全表扫描:
SELECT * FROM table_name WHERE rq='2020-01-01';
其中,table_name为需要查询的表名,rq为分区字段。
EXPLAIN SELECT * FROM table_name WHERE rq='2020-01-01';
| TableScan [TS_0] (rows=XXX width=XXX)
| default@table_name,table_name,Tbl:COMPLETE,Col:COMPLETE,Output:["xxxx","xxxx","xxxx","xxxxxx","xxxxx","xxxxxx","xxxxx"]
其中,rows表示该操作扫描表的行数,若rows=表总行数,则说明进行了全表扫描。
若hive.mapred.mode=strict,则只有进行了分区限制或使用索引等情况下,才不会进行全表扫描。
若hive.mapred.mode=nonstrict,则Hive会尝试在分区限制和索引等操作无效的情况下,避免全表扫描。若查询计划中的Scan Operator部分没有进行分区限制或使用索引等操作,且hive.mapred.mode=nonstrict,则说明进行了全表扫描。
如果以上操作不能有效判定是否进行全表扫描,则可以考虑使用Hive性能监测工具(Apache Ambari、Cloudera Manager等)或其他第三方工具来进行分析优化。