Apache Spark 2.2中基于成本的优化器(CBO)(转载)
一个启发性的例子
统计信息收集框架
ANALYZE TABLE 命令
1 ANALYZE TABLE table_name COMPUTE STATISTICS
上面的 SQL 语句可以收集表级的统计信息,例如记录数、表大小(单位是byte)。这里需要注意的是ANALYZE, COMPUTE, and STATISTICS都是保留的关键字,他们已特定的列名为入参,在metastore中保存表级的统计信息。
1 ANALYZE TABLE table_name COMPUTE STATISTICS FOR COLUMNS column-name1, column-name2, ….
需要注意的是在ANALYZE 语句中没必要指定表的每个列-只要指定那些在过滤/join条件或group by等中涉及的列
统计信息类型
过滤选择
- 对于逻辑表达式AND,他的过滤选择是左条件的选择乘以右条件选择,例如fs(a AND b) = fs(a) * fs (b)。
- 对于逻辑表达式OR,他的过滤选择是左条件的选择加上右条件选择并减去左条件中逻辑表达式AND的选择,例如 fs (a OR b) = fs (a) + fs (b) - fs (a AND b) = fs (a) + fs (b) – (fs (a) * fs (b))
- 对于逻辑表达式NOT,他的过滤因子是1.0 减去原表达式的选择,例如 fs (NOT a) = 1.0 - fs (a)
- 等于操作符 (=) :我们检查条件中的字符串常量值是否落在列的当前最小值和最大值的区间内 。这步是必要的,因为如果先使用之前的条件可能会导致区间改变。如果常量值落在区间外,那么过滤选择就是 0.0。否则,就是去重后值的反转(注意:不包含额外的柱状图信息,我们仅仅估计列值的统一分布)。后面发布的版本将会均衡柱状图来优化估计的准确性。
-
小于操作符 (<) :检查条件中的字符串常量值落在哪个区间。如果比当前列值的最小值还小,那么过滤选择就是 0.0(如果大于最大值,选择即为1.0)。否则,我们基于可用的信息计算过滤因子。如果没有柱状图,就传播并把过滤选择设置为: (常量值– 最小值) / (最大值 – 最小值)。另外,如果有柱状图,在计算过滤选择时就会加上在当前列最小值和常量值之间的柱状图桶密度 。同时,注意在条件右边的常量值此时变成了该列的最大值。
Join基数
- 左外连接(Left-Outer Join): num(A LOJ B) = max(num(A IJ B),num(A)) 是指内连接输出基和左外连接端A的基之间较大的值。这是因为我们需要把外端的每条纪录计入,虽然他们没有出现在join输出纪录内。
- Right-Outer Join: num(A ROJ B) = max(num(A IJ B),num(B))
- Full-Outer Join: num(A FOJ B) = num(A LOJ B) + num(A ROJ B) - num(A IJ B)
最优计划选择
查询的性能测试和分析
配置及方法学
1 SELECT
2 i_item_id,
3 i_item_desc,
4 s_store_id,
5 s_store_name,
6 sum(ss_net_profit) AS store_sales_profit,
7 sum(sr_net_loss) AS store_returns_loss,
8 sum(cs_net_profit) AS catalog_sales_profit
9 FROM
10 store_sales, store_returns, catalog_sales, date_dim d1, date_dim d2, date_dim d3,
11 store, item
12 WHERE
13 d1.d_moy = 4
14 AND d1.d_year = 2001
15 AND d1.d_date_sk = ss_sold_date_sk
16 AND i_item_sk = ss_item_sk
17 AND s_store_sk = ss_store_sk
18 AND ss_customer_sk = sr_customer_sk
19 AND ss_item_sk = sr_item_sk
20 AND ss_ticket_number = sr_ticket_number
21 AND sr_returned_date_sk = d2.d_date_sk
22 AND d2.d_moy BETWEEN 4 AND 10
23 AND d2.d_year = 2001
24 AND sr_customer_sk = cs_bill_customer_sk
25 AND sr_item_sk = cs_item_sk
26 AND cs_sold_date_sk = d3.d_date_sk
27 AND d3.d_moy BETWEEN 4 AND 10
28 AND d3.d_year = 2001
29 GROUP BY
30 i_item_id, i_item_desc, s_store_id, s_store_name
31 ORDER BY
32 i_item_id, i_item_desc, s_store_id, s_store_name
33 LIMIT 100
没使用CBO的Q25
使用了CBO的Q25
TPC-DS 查询性能
结论
延伸阅读
- 原理就是较小的关系更容易放到内存
- <=> 表示‘安全的空值相等’ ,如果两边的结果都是null就返回true,如果只有一边是null就返回false
- P. Griffiths Selinger, M. M. Astrahan, D. D. Chamberlin, R. A. Lorie, T. G. Price, “Access Path Selection in a Relational Database Management System”, Proceedings of ACM SIGMOD conference, 1979
- weight(权值)是调优参数,可以通过配置 spark.sql.cbo.joinReorder.card.weight (默认是0.7)
转载自 http://www.aboutyun.com/thread-22746-1-1.html
英文博客地址 https://databricks.com/blog/2017/08/31/cost-based-optimizer-in-apache-spark-2-2.html
本文转自shishanyuan博客园博客,原文链接: http://www.cnblogs.com/shishanyuan/p/8453587.html ,如需转载请自行联系原作者
