揭示CBO的力量

揭示甲骨文数据库基于成本的SQL优化器的强大功能的示例

用户拥有需要很长时间才能执行的SQL语句;实际上SQL并不是很复杂,但它有一个非常复杂的执行计划。

Mimic SQL text :
  SELECT TO_CHAR(SYSDATE, ‘yyyy-mm-dd’) AS STAT_DATE,
SYSDATE AS STAT_TIME,
X.TABLE_NAME,
NVL(X.NUM_ROWS, 0) AS TABLE_ROWS,
NVL(ROUND(X.NUM_ROWS * X.AVG_ROW_LEN / 1024, 2), 0) AS TABLE_SIZES,
Y.CREATED AS CREATE_TIME,
Z.COMMENTS AS TABLE_COMMENT,
H .COL_CNT
FROM ALL_TABLES X,
ALL_OBJECTS Y,
ALL_TAB_COMMENTS Z,
(SELECT H .TABLE_NAME, COUNT(1) AS COL_CNT
FROM ALL_TAB_COLS H
WHERE H.OWNER = ‘TOSSKA’
GROUP BY H .TABLE_NAME) H
WHERE X.TABLE_NAME = Y.OBJECT_NAME
AND X.TABLE_NAME(+) = Z.TABLE_NAME
AND X.TABLE_NAME = H.TABLE_NAME
AND Y.OBJECT_TYPE IN (‘TABLE PARTITION’, ‘TABLE’)
AND X. OWNER = ‘TOSSKA’
AND Y. OWNER = ‘TOSSKA’
AND Z. OWNER = ‘TOSSKA’
ORDER BY X.TABLE_NAME

执行计划:
以下部分计划步骤列出了总共214个执行计划步骤中的10%。

用户将SQL输入到Tosska SQL Tuning Expert for Oracle中,并按Tune开始探索是否只潜在有来自Oracle的更好的查询计划。 用户回到他的日常工作中,让计算机代他完成余下的调优工作。 最后,在一小时内找到了5个更好的SQL替代计划。

产品亮点
Tosska SQL Tuning Expert配备了一个人工智能引擎,可以针对有问题的SQL尝试最有效的Hints注入组合。 引擎可以深入探索Oracle CBO在在线SQL优化阶段无法发现的任何隐藏的良好执行计划,但这些好计划实际存在于SQL语句的计划空间中。


基准结果:
原始SQL需要14分7秒。
注入提示的最佳替代SQL是SQL 45,仅需4秒。
SQL45的运行速度比原始SQL快99倍。

Oracle CBO生成的查询计划的观察
Tosska SQL Tuning Expert是一个基于提示注入的SQL调优工具,无需重写用户的SQL。 因此,注入SQL语句的各种提示以及Oracle生成的相应查询计划都是Oracle SQL优化器可以为SQL语句提供的潜在查询计划。
让我们回顾一下那些生成的查询计划以及为什么Oracle在开始时找不到最佳查询计划的原因。

第一个观察:
原始SQL的成本是1330,但SQL 130,SQL 135和SQL 45的成本都低于原始SQL的成本,为什么Oracle无法获得这些低成本计划?
原因:
Oracle无法探索它可以在短时间内生成的所有潜在查询计划,否则它将需要更长的时间来优化所指定的SQL,而这可能无法以不能预见的更好的查询计划完全补偿的。

第二个观察:
SQL 127和SQL 129的成本比原始SQL高3倍,但速度比原始SQL快得多,这意味着这两个SQL的成本估算异常错误。
原因:
这是数据库SQL优化器中使用的成本估算算法的局限性。 从理论上讲,市场上没有100%准确的SQL成本估算算法可以处理各种环境,对于像上述SQL语句这样复杂的SQL语句尤其如此。

结论:
Oracle拥有市场上最复杂的SQL优化器。 Oracle有很多更好的查询计划可以让您的SQL语句更快地运行。 因此,当您考虑升级硬件或云服务支出时,都应首先探索Oracle SQL优化器为SQL语句提供的潜在能力,而您所需要的只是一个能够揭示Oracle SQL优化器潜在能力的正确工具。

Tosska SQL Tuning Expert (TSE™) ® for Oracle®

Tosska SQL Tuning Expert Pro (TSE Pro™) for Oracle®