列统计
hive.stats.fetch.bitvector
Metastore 中计算列统计的逻辑取决于 hive-site.xml 中的配置键 hive.stats.fetch.bitvector。一般来说,当设置为 true 时,Metastore 提供更准确的列统计,尽管由于向 Metastore 数据库发送额外查询,成本会略高。
对于涉及多个表上各种 join 运算符的长时间运行的查询,hive.stats.fetch.bitvector 的值会显著影响执行时间。在我们的实验中,在 TPC-DS 基准测试的 10TB 规模因子下,查询 23 和查询 24 的执行时间如下变化:
- 将
hive.stats.fetch.bitvector设置为 false 时,- 总执行时间:1418 秒
- 查询 23:274 秒,346 秒
- 查询 24:336 秒,462 秒
- 总执行时间:1418 秒
- 将
hive.stats.fetch.bitvector设置为 true 时- 总执行时间:805 秒
- 查询 23:199 秒,231 秒
- 查询 24:90 秒,285 秒
- 总执行时间:805 秒
hive.stats.fetch.bitvector 在 MR3 发布版本中默认设置为 true。如果 Metastore 的开销太高(例如,当与 Metastore 数据库的连接非常慢时),用户可以将其设置为 false。
计算列统计
计算列统计对于生成高效查询计划至关重要。用户可以通过执行 analyze table 命令来计算列统计,然后通过检查属性 COLUMN_STATS_ACCURATE 来查看结果。需要注意的是,即使配置键 hive.stats.column.autogather 设置为 true,仍建议手动计算列统计以获得更准确的统计信息。
0: jdbc:hive2://blue0:9842/> analyze table store_sales compute statistics for columns;
0: jdbc:hive2://blue0:9842/> describe formatted store_returns sr_customer_sk;
+------------------------+---------------------------------------------------+
| column_property | value |
+------------------------+---------------------------------------------------+
| COLUMN_STATS_ACCURATE | {"COLUMN_STATS":{"sr_customer_sk":"true"}} |
+------------------------+---------------------------------------------------+