GP-sql编写原则

来源:互联网 发布:mysql连接命令 编辑:程序博客网 时间:2024/05/07 19:33
一、大表与小表关联
    A、避免小表left join大表
        解决方案:
        小表left join(大表inner join小表的结果),其中可能还需要去重等结合实际逻辑的处理
    B、分布键不是关联键,导致大表重分布现象
        解决方案:
        及时为大表收集统计信息,让GP将大表作为大表处理,而不是作为小表处理
        GP对表记录的评估在执行计划的SCAN表操作中可以看到
    C、分布键不是关联键,导致重分布时出现严重倾斜
        解决方案:
        及时为大表收集统计信息,让GP将大表作为大表处理,而不是作为小表处理
        需要对关联字段对数据分布情况的影响有深入的了解,尽早避免该问题的出现        
    D、大表过滤条件导致GP误认为其中间结果数据量很小
        解决方案:
        a、收集相关条件字段的统计信息
            但、该方法不能完全确保收集统计信息之后就不会出现中间结果数据量评估失真现象
        b、将中间结果存入一张临时表,再继续做与小表的关联
    E、多表关联导致多步关联之后中间结果数据量严重失真
        解决方案:
        只能用临时表进行逐步实现,没有捷径
    F、多表关联时关联顺序不复合业务预期
        解决方案:
        a、使用with子句或者使用临时强制走指定的关联顺序
        b、设置from_collapse_limit和join_collapse_limit为1强制GP不对关联顺序做调整
    G、隐式笛卡尔积
        解决方案:
        a、避免出现隐式笛卡尔积的情况,此情况不可控
        b、假如业务中有需要,尽可能修改为先汇总再关联
二、大表与大表关联
    A、通常HASH JOIN的性能是高于MERGE JOIN的,首选使用HASH JOIN
        FULL JOIN一定会走MERGE JOIN,考虑使用UNION ALL之后做GROUP BY
    B、避免关联之前的重分布操作
        应该从表设计阶段就为大表与大表的关联考虑选择使用关联键作为分布键
三、尽量避免任何表之间的关联走NESTLOOP JOIN
    在数据库层面,NESTLOOP JOIN是嵌套循环,执行计划中的COST会急速上升
    通常在表设计阶段要确保关联字段之间使用相同的数据类型,错误的数据类型关联可能会导致NESTLOOP JOIN的出现

总之:学会读懂执行计划,掌握SQL的执行过程,结合数据情况,掌控执行过程,确保SQL按照期望的步骤执行
关键:深入了解你所操作的数据,而不是依赖数据库的所谓的智能

0 0
原创粉丝点击