gpt4 book ai didi

sql - 交换 SELECT 语句时 Oracle JOIN 操作性能发生变化

转载 作者:行者123 更新时间:2023-12-02 14:51:53 25 4
gpt4 key购买 nike

我在研究 Oracle 查询解析和性能时遇到了以下行为。我为此使用了以下查询,

SELECT 1 
FROM USER_PROCEDURES
WHERE OBJECT_NAME = SUBSTR( UPPER('Client_Sys.Clear_Info' ), 1, INSTR( UPPER('Client_Sys.Clear_Info'), '.' ) - 1 )
AND PROCEDURE_NAME = SUBSTR( UPPER('Client_Sys.Clear_Info' ), INSTR( UPPER('Client_Sys.Clear_Info' ),'.' ) + 1 )
UNION
SELECT 1
FROM USER_OBJECTS
WHERE OBJECT_NAME = UPPER('Client_Sys.Clear_Info')
AND OBJECT_TYPE = 'PROCEDURE';

上述查询的解释计划如下,

enter image description here

现在我将查询更改为以下格式[交换 SELECT 语句],

SELECT 1 
FROM USER_OBJECTS
WHERE OBJECT_NAME = UPPER('Client_Sys.Clear_Info')
AND OBJECT_TYPE = 'PROCEDURE'
UNION
SELECT 1
FROM USER_PROCEDURES
WHERE OBJECT_NAME = SUBSTR( UPPER('Client_Sys.Clear_Info' ), 1, INSTR( UPPER('Client_Sys.Clear_Info'), '.' ) - 1 )
AND PROCEDURE_NAME = SUBSTR( UPPER('Client_Sys.Clear_Info' ), INSTR( UPPER('Client_Sys.Clear_Info' ),'.' ) + 1 ) ;

相应的解释方案如下,

enter image description here

运营成本之间存在显着差异。这可能是一个非常基本的事情,但由于我是 Oracle [或任何数据库内容] 的新手,这对我来说是一个难题。希望你能帮助我理解这种行为。

提前致谢!

最佳答案

Oracle 12c:

USER_PROCEDURES 中的函数 NO_ROOT_SW_FOR_LOCAL 似乎是造成差异的原因。

一般来说,更改谓词、FROM 子句中的表或 UNION 语句中的查询 block 等内容的顺序对执行计划没有任何有意义的影响。 使用UNION,某些子计划可能会翻转,但总成本将相同。

对于这个具体案例,首先将语句简化为:

explain plan for select 1 from user_procedures union select 1 from dual;
select * from table(dbms_xplan.display);

explain plan for select 1 from dual union select 1 from user_procedures;
select * from table(dbms_xplan.display);

两个子执行计划不仅仅是交换,而且变化很大,而且总数也不同。与大多数数据字典查询一样,计划很大,并且此处未显示 266 行输出。

USER_PROCEDURES 的源代码包含奇数代码 ... 来自 NO_ROOT_SW_FOR_LOCAL(INT$DBA_PROCEDURES) ...。删除 NO_ROOT_SW_FOR_LOCAL 后,计划差异就会消失。

我不知道该函数的作用,也找不到任何引用。 DBA_OBJECTS、DBA_SOURCE、support.oracle.com 甚至 Google 中都没有。这是我们在没有任何严重黑客攻击的情况下所能挖掘到的极限。如果这种成本差异是一个问题,那么您将需要向 Oracle 提出服务请求。

11克:

关于sql - 交换 SELECT 语句时 Oracle JOIN 操作性能发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21084074/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com