返回数说广场
0
在oracle中下面关于子查询展开的说法正确的有哪些?
A子查询展开后的效率一定比未展开好。
B转换后的SQL和原SQL在语义上一定是等价的。
C是将子查询査询转换为它自身和外部査询之间等价的表连接。
D不是所有的子査询都能做子査询展开。
BCD
子査询展开(Subquery Unnesting)是优化器处理带子査询的目标SQL的一种优化手段,它是指优化器不再将目标SQL中的子査询当作一个独立的处理单元来单独执行,而是将该子査询转换为它自身和外部査询之间等价的表连接。这种等价表连接转换要么是将子査询拆开(即将该子査询中的表、视图从子査询中拿出来,然后和外部査询中的表、视图做表连接),要么是不拆开但是会把该子査询转换为一个内嵌视图(Inline View),然后再和外部査询中的表、视图做表连接。
Oracle会确保子査询展开所对应的等价表连接转换的正确性,即转换后的SQL和原SQL在语义上一定是等价的。当然,不是所有的子査询都能做子査询展开,有些子査询是不能做这种等价表连接转换的,这种情况下Oracle就不会对其做子査询展开,也就是说此时Oracle还是会将该子査询当作一个独立的处理单元来单独执行。另外,在Oracle 10g及其以后的版本中,对于那种不拆开子査询但是会把该子査询转换成一个内嵌视圏的子査询展开(即子査询展开的第二种情形),只有当经过子査询展开后的等价改写SQL的成本值小于原
SQL的成本值时,Oracle才会对原SQL执行子査询展开。
0
0 118
分享
评论
热门数说


