`
ding__lin
  • 浏览: 20342 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

SQLLineage.com(SQL优化:列裁剪)

阅读更多

列裁剪是SQL优化中最常见的优化规则,就是对于没有用到的列就没必要读取已减少IO的消耗。

 

为什么出现列裁减?

一、SQL本身就有逻辑问题,包含了与结果无关的数据列:

如:sql1:select a,b from ( select a,b,c from tab1 ) t中SubSelect子查询中的字段c就是可列裁剪的对象。

 

二、为了复用已有的数据模型设计,但实际的需求只需部分数据字段

一个简单分层数仓每个数据层都设计了特定的数据模型,冗余了多个数据字段便于多业务系统复用,数据需要按照数据模型逐层的生产。而现实的情况是冗余字段造成了不必要的计算资源消耗,特别是实时性要求较高的应用场景。

 

http://www.sqllineage.com/demo SQL分析工具提供了列裁剪的功能,即可分析SQL本身存在的裁剪对象,也可以主动选择需要忽略的数据列,从而计算出优化的SQL(目前还在努力实现中)。

 

 

 

优化的SQL计划分为2种模式输出:

1.输入是单条SQL,输出等价的SQL 如文中的sql1等价为 select a,b from tab1 (同时应用了投影消除规则)

2.输入是一组SQL(SQL相互依赖,但无循环依赖)模拟多层的数据生产,绘制DAG图,根据结果的列裁剪需求计算出,每条SQL等价的列裁剪SQL。

如下一组SQL:

sql2: create table ODS_TAB as select a,b,c from TAB

sql3: create table DW_TAB as select a*b as num,c from ODS_TAB

sql4: create table APP_TAB as select sum(num) from DW_TAB

等价为:

sql2: create table ODS_TAB as select a,b from TAB

sql3: create table DW_TAB as select a*b as num from ODS_TAB

sql4: create table APP_TAB as select sum(num) from DW_TAB

当然这些例子过于简单,如果您有更复杂的SQL关系组欢迎提供给我。对工具有任何改进意见也欢迎微信交流。

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics