暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

HINT随笔之 适当欺骗ORACLE有益身心健康

SQL之美 2021-04-09
312

事件简要说明:

临时有个小需求报表导出需求,现场编写SQL,将4000+单列数据 来自于EXCEL的数据,灌入临时表中指定一个字段里(灌入前清空该表),再与 3张50W量级关联,最终结果1W+以内,在每个表关联条件都有的情况下,遭遇笛卡尔积,无法导出。

具体事件展示:

由于是现写的SQL,不存在历史干扰,PLSQL直接F5查看执行计划

(PS:新手勿常用F5,不一定准确,容易误导)

可以明显看出abcd4个表都有关联关系,由于临时表C表直接清空输入再灌入的,未收集统计信息,导致CBO估算rows=1,然后这里b表和d表同时关联了a表,CBO就错误估算了COST,走了笛卡尔积。

接下来尝试手工指定表链接:

CBO不为所动,让我们继续补充hint:

果然,变化成功,

0.5s完事,这是正规玩法,那么对于这种只是临时执行一次,且主表数据也是临时的SQL,还有木有别的玩法呢?

这里,就不得不提cardinality, 很多复杂SQL抓取性能瓶颈,我测试HINT经常用到它,既然这里CBO估算rows=1 那我让CBO变成999999呢 ?还会走笛卡尔积么?

果然,成功欺骗,网上很多说这玩意不靠谱,行不行咱们还得试一把:


也是0.5s,哈哈,果然 适当欺骗下oracle也是挺有趣的,机智的CBO还得在老司机的掌舵下才能运行的更好。

文章转载自SQL之美,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论