为了好玩我一直在玩内置的蟾蜍优化甲骨文今天。一个它暗示优化的是以下

AND emp.pay_type = NVL('FT', UID)

代替

AND emp.pay_type = 'FT'

我困惑于这里发生了什么,并因为它的,也搞不清楚关于为什么这会提高性能。由于FT是SQL查询中的字符串字面量,因此不为NULL,为什么会这样有什么区别?我猜它是与在球场上现有的指数,但我无法找到在Oracle文档任何东西。

有帮助吗?

解决方案

这是奇怪的建议。该NVL函数是这样的:

NVL(exp1, val1)

如果“EXP1”不为空,则返回;否则 'VAL1' 被返回。

由于在例如不能为NULL“FT”,没有好处使用NVL功能,和一个小的性能损失(至少对于优化器制定出NVL是冗余的;也许执行惩罚如果优化不工作指出,NVL是冗余的)。

如果条件如下:

和emp.pay_type = NVL( “FT”,UID)

然后有可能是一个益处;在这里,我们有一个分隔标识符(列名包含在双引号)和列值或许是NULL;所述NVL调用确保返回NULL仅当 “FT” 是NULL UID是NULL。 UID是,当然,常规标识符

有可能,如果条件读意义:

AND emp.pay_type = NVL(UID, 'FT')

现在,如果UID值是NULL,则默认值“FT”被用作相应的pay_type。

其他提示

我会拿蟾蜍的“优化建议”与盐的巨大的晶粒。我打电话给他们优化的“鸟枪法” - 在拍摄目标一大堆不同的位,看看其中哪一个命中,不知何故:)

反正之间的差

AND emp.pay_type = NVL('FT', UID)

AND emp.pay_type = 'FT'

的是,在第二情况下,优化可以使用在列的直方图统计信息(如果它们已经聚集),以获得匹配的行数的更准确的估计。当使用NVL,然而,优化器将(I相信)不检测它可以忽略NVL,因此不会检查直方图的值。

这是不优化方法我一般会使用。有更好的方法来控制查询的执行路径(提示,例如)。特别是,如果它们改进了CBO寻找和优化冗余代码等NVL([literal value],[anything])[literal value]这种方法会失败。

什么是Oracle的解释计划告诉你两个查询?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top