0.简介

Analyze,分析表(也称为计算统计信息)是一种内置的Hive操作,可以执行该操作来收集表上的元数据信息。这可以极大的改善表上的查询时间,因为它收集构成表中数据的行计数,文件计数和文件大小(字节),并在执行之前将其提供给查询计划程序。

1.如何分析表?

  • 基础分析语句
ANALYZE TABLE my_database_name.my_table_name COMPUTE STATISTICS;

这是一个基础分析语句,不限制是否存在表分区,如果你是分区表更应该定期执行。

  • 分析特定分区
ANALYZE TABLE my_database_name.my_table_name PARTITION (YEAR=2019, MONTH=5, DAY=12) COMPUTE STATISTICS;

这是一个细粒度的分析语句。它收集指定的分区上的元数据,并将该信息存储在Hive Metastore中已进行查询优化。该信息包括每列,不同值的数量,NULL值的数量,列的平均大小,平均值或列中所有值的总和(如果类型为数字)和值的百分数。

  • 分析列
ANALYZE TABLE my_database_name.my_table_name COMPUTE STATISTICS FOR column1, column2, column3;

它收集指定列上的元数据,并将该信息存储在Hive Metastore中以进行查询优化。该信息包括每列,不同值的数量,NULL值的数量,列的平均大小,平均值或列中所有值的总和(如果类型为数字)和值的百分数。

  • 分析指定分区上的列
ANALYZE TABLE my_database_name.my_table_name PARTITION (YEAR=2019, MONTH=5, DAY=12, HOUR=0) COMPUTE STATISTICS for column1, column2, column3;ANALYZE TABLE my_database_name.my_table_name PARTITION (YEAR=2019, MONTH=5, DAY=12, HOUR) COMPUTE STATISTICS for column1, column2, column3;ANALYZE TABLE my_database_name.my_table_name PARTITION (YEAR=2019, MONTH=5, DAY=12, HOUR) COMPUTE STATISTICS FOR COLUMNS;

第一个SQL只会分析单小时分区上的列信息;
第二个SQL会分析单天分区上的列信息;
第三个SQL会分析单天分区上的所有列信息。

2.效果验证

测试案例1

  • 数据准备
    选取KS3线上数据集、TPC-DS基准测试数据集作为样本。结合Hive表分析操作,对多个文件格式以及压缩算法下的数据查询时间进行比对。
SELECT count(DISTINCT(uuid)) AS script_appentry_30day_uv
FROM test_hive.document_assistant
WHERE dt >= '2019-03-12'AND dt <= '2019-04-10'AND p3 = '14'AND p5 = 'script_appentry'
  • 测试结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Sn5VklqR-1587978901532)(https://github.com/buildupchao/ImgStore/blob/master/blog/analyze_table2.png?raw=true)]

测试案例2

  • 数据准备(TPC-DS基础测试)

    • 美国事务处理效能委员会(TPC,Transaction Processing Performance Council) :是目前最知名的非赢利的数据管理系统评测基准标准化组织。它定义了多组标准测试集用于客观地、可重现地评测数据库的性能。
    • TPC-DS测试基准是TPC组织推出的用于替代TPC-H的下一代决策支持系统测试基准:TPC-DS采用星型、雪花型等多维数据模式。它包含7张事实表,17张维度表,平均每张表有18列。
    • TPC-DS 特点:
      • 共99个测试案例,遵循SQL’99和SQL 2003的语法标准,SQL案例比较复杂;
      • 分析的数据量大,并且测试案例是在回答真实的商业问题;
      • 测试案例中包含各种业务模型(如分析报告型,迭代式的联机分析型,数据挖掘型等);
      • 几乎所有的测试案例都有很高的IO负载和CPU计算需求。

场景:单事实表、多个维表,复杂的Join
Store_Sales表记录数:2,879,987,999
事实表存储大小(GB):Text:390, Parquet(Gzip):116, Orc(Zlib):131

query27.sql:

-- start query 1 in stream 0 using template query27.tpl and seed 2017787633
select  i_item_id,s_state, grouping(s_state) g_state,avg(ss_quantity) agg1,avg(ss_list_price) agg2,avg(ss_coupon_amt) agg3,avg(ss_sales_price) agg4from store_sales, customer_demographics, date_dim, store, itemwhere ss_sold_date_sk = d_date_sk andss_item_sk = i_item_sk andss_store_sk = s_store_sk andss_cdemo_sk = cd_demo_sk andcd_gender = 'M' andcd_marital_status = 'U' andcd_education_status = '2 yr Degree' andd_year = 2001 ands_state in ('SD','FL', 'MI', 'LA', 'MO', 'SC')group by rollup (i_item_id, s_state)order by i_item_id,s_statelimit 100;-- end query 1 in stream 0 using template query27.tpl

query28.sql:

-- start query 1 in stream 0 using template query28.tpl and seed 444293455
select  *
from (select avg(ss_list_price) B1_LP,count(ss_list_price) B1_CNT,count(distinct ss_list_price) B1_CNTDfrom store_saleswhere ss_quantity between 0 and 5and (ss_list_price between 11 and 11+10or ss_coupon_amt between 460 and 460+1000or ss_wholesale_cost between 14 and 14+20)) B1,(select avg(ss_list_price) B2_LP,count(ss_list_price) B2_CNT,count(distinct ss_list_price) B2_CNTDfrom store_saleswhere ss_quantity between 6 and 10and (ss_list_price between 91 and 91+10or ss_coupon_amt between 1430 and 1430+1000or ss_wholesale_cost between 32 and 32+20)) B2,(select avg(ss_list_price) B3_LP,count(ss_list_price) B3_CNT,count(distinct ss_list_price) B3_CNTDfrom store_saleswhere ss_quantity between 11 and 15and (ss_list_price between 66 and 66+10or ss_coupon_amt between 920 and 920+1000or ss_wholesale_cost between 4 and 4+20)) B3,(select avg(ss_list_price) B4_LP,count(ss_list_price) B4_CNT,count(distinct ss_list_price) B4_CNTDfrom store_saleswhere ss_quantity between 16 and 20and (ss_list_price between 142 and 142+10or ss_coupon_amt between 3054 and 3054+1000or ss_wholesale_cost between 80 and 80+20)) B4,(select avg(ss_list_price) B5_LP,count(ss_list_price) B5_CNT,count(distinct ss_list_price) B5_CNTDfrom store_saleswhere ss_quantity between 21 and 25and (ss_list_price between 135 and 135+10or ss_coupon_amt between 14180 and 14180+1000or ss_wholesale_cost between 38 and 38+20)) B5,(select avg(ss_list_price) B6_LP,count(ss_list_price) B6_CNT,count(distinct ss_list_price) B6_CNTDfrom store_saleswhere ss_quantity between 26 and 30and (ss_list_price between 28 and 28+10or ss_coupon_amt between 2513 and 2513+1000or ss_wholesale_cost between 42 and 42+20)) B6
limit 100;-- end query 1 in stream 0 using template query28.tpl

query43.sql:

-- start query 1 in stream 0 using template query43.tpl and seed 1819994127
select  s_store_name, s_store_id,sum(case when (d_day_name='Sunday') then ss_sales_price else null end) sun_sales,sum(case when (d_day_name='Monday') then ss_sales_price else null end) mon_sales,sum(case when (d_day_name='Tuesday') then ss_sales_price else  null end) tue_sales,sum(case when (d_day_name='Wednesday') then ss_sales_price else null end) wed_sales,sum(case when (d_day_name='Thursday') then ss_sales_price else null end) thu_sales,sum(case when (d_day_name='Friday') then ss_sales_price else null end) fri_sales,sum(case when (d_day_name='Saturday') then ss_sales_price else null end) sat_salesfrom date_dim, store_sales, storewhere d_date_sk = ss_sold_date_sk ands_store_sk = ss_store_sk ands_gmt_offset = -6 andd_year = 1998group by s_store_name, s_store_idorder by s_store_name, s_store_id,sun_sales,mon_sales,tue_sales,wed_sales,thu_sales,fri_sales,sat_saleslimit 100;-- end query 1 in stream 0 using template query43.tpl

query67.sql:

-- start query 1 in stream 0 using template query67.tpl and seed 1819994127
select  *
from (select i_category,i_class,i_brand,i_product_name,d_year,d_qoy,d_moy,s_store_id,sumsales,rank() over (partition by i_category order by sumsales desc) rkfrom (select i_category,i_class,i_brand,i_product_name,d_year,d_qoy,d_moy,s_store_id,sum(coalesce(ss_sales_price*ss_quantity,0)) sumsalesfrom store_sales,date_dim,store,itemwhere  ss_sold_date_sk=d_date_skand ss_item_sk=i_item_skand ss_store_sk = s_store_skand d_month_seq between 1212 and 1212+11group by  rollup(i_category, i_class, i_brand, i_product_name, d_year, d_qoy, d_moy,s_store_id))dw1) dw2
where rk <= 100
order by i_category,i_class,i_brand,i_product_name,d_year,d_qoy,d_moy,s_store_id,sumsales,rk
limit 100;-- end query 1 in stream 0 using template query67.tpl

query46.sql:

-- start query 1 in stream 0 using template query46.tpl and seed 803547492
select  c_last_name,c_first_name,ca_city,bought_city,ss_ticket_number,amt,profitfrom(select ss_ticket_number,ss_customer_sk,ca_city bought_city,sum(ss_coupon_amt) amt,sum(ss_net_profit) profitfrom store_sales,date_dim,store,household_demographics,customer_addresswhere store_sales.ss_sold_date_sk = date_dim.d_date_skand store_sales.ss_store_sk = store.s_store_skand store_sales.ss_hdemo_sk = household_demographics.hd_demo_skand store_sales.ss_addr_sk = customer_address.ca_address_skand (household_demographics.hd_dep_count = 2 orhousehold_demographics.hd_vehicle_count= 1)and date_dim.d_dow in (6,0)and date_dim.d_year in (1998,1998+1,1998+2)and store.s_city in ('Cedar Grove','Wildwood','Union','Salem','Highland Park')group by ss_ticket_number,ss_customer_sk,ss_addr_sk,ca_city) dn,customer,customer_address current_addrwhere ss_customer_sk = c_customer_skand customer.c_current_addr_sk = current_addr.ca_address_skand current_addr.ca_city <> bought_cityorder by c_last_name,c_first_name,ca_city,bought_city,ss_ticket_numberlimit 100;-- end query 1 in stream 0 using template query46.tpl

query7.sql:

-- start query 1 in stream 0 using template query7.tpl and seed 1930872976
select  i_item_id,avg(ss_quantity) agg1,avg(ss_list_price) agg2,avg(ss_coupon_amt) agg3,avg(ss_sales_price) agg4from store_sales, customer_demographics, date_dim, item, promotionwhere ss_sold_date_sk = d_date_sk andss_item_sk = i_item_sk andss_cdemo_sk = cd_demo_sk andss_promo_sk = p_promo_sk andcd_gender = 'F' andcd_marital_status = 'W' andcd_education_status = 'Primary' and(p_channel_email = 'N' or p_channel_event = 'N') andd_year = 1998group by i_item_idorder by i_item_idlimit 100;-- end query 1 in stream 0 using template query7.tpl

query73.sql:

-- start query 1 in stream 0 using template query73.tpl and seed 1971067816
select c_last_name,c_first_name,c_salutation,c_preferred_cust_flag,ss_ticket_number,cnt from(select ss_ticket_number,ss_customer_sk,count(*) cntfrom store_sales,date_dim,store,household_demographicswhere store_sales.ss_sold_date_sk = date_dim.d_date_skand store_sales.ss_store_sk = store.s_store_skand store_sales.ss_hdemo_sk = household_demographics.hd_demo_skand date_dim.d_dom between 1 and 2and (household_demographics.hd_buy_potential = '>10000' orhousehold_demographics.hd_buy_potential = 'unknown')and household_demographics.hd_vehicle_count > 0and case when household_demographics.hd_vehicle_count > 0 thenhousehold_demographics.hd_dep_count/ household_demographics.hd_vehicle_count else null end > 1and date_dim.d_year in (2000,2000+1,2000+2)and store.s_county in ('Mobile County','Maverick County','Huron County','Kittitas County')group by ss_ticket_number,ss_customer_sk) dj,customerwhere ss_customer_sk = c_customer_skand cnt between 1 and 5order by cnt desc;-- end query 1 in stream 0 using template query73.tpl
  • 测试结果

3.结论

  • Hive执行表分析后能大幅加速查询速度

    • 查询耗时(压缩算法):None > Snappy > Gzip/Zlib
    • 查询耗时(文件格式):Text > Parquet > Orc
  • 当前测试场景下,ORC格式查询耗时最低

    • Parquet与Orc查询耗时接近

Hive SQL查询效率提升之Analyze方案的实施相关推荐

  1. DB2性能优化 – 如何通过db2优化工具提升SQL查询效率

    我们都知道,应用系统在运行一段时间后,用户报告系统运行会变慢,使他们不能完成所有的工作,完成事务和处理查询花费过长时间,或者应用程序在一天的某些时段变慢,要确定造成问题的本质原因,必须评估系统资源的实 ...

  2. 关于SQL查询效率,100w数据,查询只要1秒

    1.关于SQL查询效率,100w数据,查询只要1秒,与您分享: 机器情况 p4: 2.4 内存: 1 G os: windows 2003 数据库: ms sql server 2000 目的: 查询 ...

  3. sql如何遍历几百万的表_关于SQL查询效率,100w数据,查询只要1秒

    1.关于SQL查询效率,100w数据,查询只要1秒,与您分享: 机器情况 p4: 2.4 内存: 1 G os: windows 2003 数据库: ms sql server 2000 目的: 查询 ...

  4. SQL查询效率:100w数据查询只需要1秒钟

    机器情况 p4: 2.4 内存: 1 G os: windows 2003 数据库: ms sql server 2000 目的: 查询性能测试,比较两种查询的性能 SQL查询效率 step by s ...

  5. SQL执行效率提升几万倍的操作详解!

    作者:风过无痕-唐 场景 我用的数据库是MySQL5.6,下面简单的介绍下场景 课程表: create table Course(c_id int PRIMARY KEY,name varchar(1 ...

  6. 关于解决MYSQL的like模糊查询效率的一种方案

    大家都知道like %suibin% 这种查询的效率极低,而MYSQL也建议不要这样模糊查询,常用的是把数据同步到CACHE里: 1.比如同步到ES里用ES模糊查询.或者同步数据到MongoDB实现模 ...

  7. Oracle提高SQL查询效率where语句条件的先后次序

    (1)选择最有效率的表名顺序(只在基于规则的优化器中有效): Oracle的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处 ...

  8. 改了一行代码,MySQL查询效率提升了80%,老板奖了我50万

     ⭐前言 优化MySQL数据库是数据库管理员必备的技能,通过不同的优化方式方法来达到提高MySQL数据库性能的目的. MySQL数据库当用户和数据量非常少的情况下,我们就很难判断MySQL数据库性能的 ...

  9. exists查询慢_8个SQL查询效率优化原则

    点击上方"Java秃头哥",选择"星标" 每天分享优质干货 1.对查询进行优化,应尽可能避免全表扫描 首先应考虑在 where 及 order by 涉及的列上 ...

最新文章

  1. jquery书写左右两个多选下拉列表交换移除功能
  2. 关于Inflater
  3. 在单链表写入一组数据代码_链表常见操作和15道常见面试题
  4. 从PCB焊接角度谈画PCB图时应注意的问题
  5. 计算机二级在学校报还是外面报好,谁知道考计算机二级在哪个学校比较好啊?...
  6. python难嘛-学python难吗
  7. 提升数据分析能力成熟度之四步曲_数据分析师
  8. Python 数据分析三剑客之 Pandas(二):Index 索引对象以及各种索引操作
  9. Mysql学习总结(53)——使用MySql开发的Java开发者规范
  10. leetcode之每日温度
  11. 致远互联发布的智慧协同新一代企业管理平台,新在哪里?
  12. ipv6有必要打开吗_路由器中的IPv6功能需不需要开启?
  13. 机器人学笔记之——操作臂运动学:驱动器空间、关节空间和笛卡尔空间
  14. 神武临时服回服务器在那个位置,2021年6月25日游戏更新公告
  15. read/write函数
  16. 舒淇陈坤言承旭周渝民 揭秘与助理的爱恨纠葛
  17. 计算机显示器型号参数单价,飞利浦电脑显示器价格表一览【详解】
  18. 新元宇宙奇科幻小说原创作品每周连载《地球人奇游天球记》第九回女神伴飞
  19. 我的jQuery学习之路_笔记(三)
  20. VMware虚拟机中摄像头打开显示黑屏或者摄像头打开无法弹出窗口的解决办法

热门文章

  1. linux裁剪图片的软件,【美图秀秀Linux版】美图秀秀Linux版下载 v1.0.0.0 免费最新版-趣致软件园...
  2. 微信小程序座位预约,微信小程序实现订座位,餐厅座位预约小程序毕设作品
  3. 勤哲EXCEL服务器财务进销存系统
  4. matlab心电信号处理,基于Matlab的心电信号自动处理系统的设计与开发 毕业论文设计.doc...
  5. 菜鸟好文推荐(九)——程序员”青春饭”问题之我见
  6. 【无人机】【2014.08】无人机国家的诞生:自1917年以来的美国无人机发展
  7. vscode vue es6语法配置检测
  8. obj-c中Autorelease、属相定义Property、对象的操作
  9. 那个炒币,8小时赚了一辆法拉利的女大学生,现在怎么样了?
  10. 如何提高项目交付效率