x

pack sql做的sql优化 | 甲鱼的大数据之旅 · · 2776 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

es 6.3的插件xpack内置了sql, 和NPLChina的elasticsearch-sql插件相比,要少很多实用性的功能,但相比有蛮多性能上的优势。今天看看都有哪些sql优化点。

x-pack sql做的sql优化

  • PruneDuplicatesInGroupBy: 裁剪重复的group by 字段。以sqlselect * from table group by code,code,这里两次group by都是code,在elasticsearch-sql中,会被group by两次重复计算。xpack-sql做了这个优化,然而是一个没用的优化,因为xpack-sql不支持多字段group by,直接报错。

  • ReplaceDuplicateAggsWithReferences: 对聚合函数的别名和函数做统一列名。以sql select count(*) c,count(*) from index为例,count(*) ccount(*) 都会被统一成count(*) c来处理掉。性能上并不会因为这个有什么变化。

  • ReplaceAggsWithMatrixStats:SKEWNESS,KURTOSIS使用matrix_stats来替代掉,matrix_stats是es提前统计好的,这么做会有很大的性能提升,不需要真的去计算斜率和偏度系数。

  • ReplaceAggsWithExtendedStats :SUM_OF_SQUARES, STDDEV_POP, VAR_POP等方法转换成使用es提前计算好的extended_stats的方法。

  • ReplaceAggsWithStats:min,max,avg,sum方法直接调用es的stats方法,而不是真的去查询遍历,这个对性能有非常大的提升。跟前面两个的性质一样。

  • PromoteStatsToExtendedStats,ReplaceAggsWithPercentiles,ReplceAggsWithPercentileRanks:PERCENTILE和PERCENTILE_RANK方法使用。

  • CombineProjections: 合并掉一些相同的别名之类的东西。

  • ReplaceFoldableAttributes: 替换掉已知的属性,举例ELECT 5 a, 3 + 2 b ... WHERE a < 10 ORDER BY b,那么a和b不需要去数据库中查询,直接给替换掉。

  • ConstantFolding: 针对别名做的优化,多个别名重复之类的。

  • BooleanSimplification: 一些简单的boolean计算直接计算出来,不走数据库,比如 2=2 and 1=1之类的。

  • BinaryComparisonSimplification: 一些简单的>=,<之类的二进制大小比较。

  • BooleanLiteralsOnTheRight: 从源码上看如果是BinaryExpression,并且右边表达式是Literal,则会替换掉左右的值。比如field = 10,会被替换成10 = field.

  • CombineComparisonsIntoRange : 合并掉>/>= AND </<= ,</<= AND >/>=的比较区间。 比如 a>5 and a>10 给合并成了a>10 。

  • PruneFilters: 裁剪filter,只对Literal的condition生效,Literal的Condition能直接生效立即知道true还是false.

  • PruneOrderBy: 裁剪Order by,1. 移除order by的常量,例如 select 1 a,field from table order by a,field ,那么a会被裁剪掉

  • PruneOrderByNestedFields:

  • PruneCast:

  • SkipQueryOnLimitZero: 如果是limit 0则直接跳过查询

  • SkipQueryIfFoldingProjection: 如果是已经找到值的则跳过查询

做了蛮多sql语句层的优化,但是并没有找到类似CBO那样的优化,不过es自己在底层做查询的时候本身有针对倒排索引的优化,就算xpack-sql里没有也不是太大的问题。

本文来自:pack sql做的sql优化 | 甲鱼的大数据之旅

感谢作者:pack sql做的sql优化 | 甲鱼的大数据之旅

查看原文:x

2776 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传