案例子句执行程序

时间:2013-03-13 12:12:01

标签: sql performance oracle query-performance

嗨我有一个非常慢的SQL。

select case when (value=1) 
then (select <Some Math Logic> from table where table.id=table_2.id) 
else 'false' end 
from table_2 where <where clause>

我想知道的是case子句如何工作.. ??

部分select <Some Math Logic> from table正在处理庞大的表集。

在Java中我们看到if语句

if(condition_1==true) 
{return output;} 
else 
{return false;}

如果if语句为false,则其中的部分永远不会被处理,那么我想知道的是oracle SQL中是否也是相同的。

它是否适用于以下逻辑.. ??

  • 检查案例条件
  • 如果为true,则处理输出内部
  • else处理其他输出。

还是采用以下逻辑:

  • 预处理所有子查询
  • 检查案例条件
  • 如果为true,则显示输出内容
  • else显示其他输出。

请帮助

编辑:伙计们我不想调整上面显示的查询...这只是一个虚拟的。

我需要知道的是案例条款如何逐步运作。

请分享是否有人为此提供了一些意见

3 个答案:

答案 0 :(得分:2)

这会解决您的问题吗?

SELECT
   COALESCE(<Some Math Logic>, 'false')
FROM table_2 T2
    LEFT JOIN table T
        ON T.Id = T2.Id
           and T2.value = 1
WHERE <where clause>

答案 1 :(得分:0)

好问题。您需要查看执行计划以确定。数据库引擎可以自由使用它认为合适的任何算法,只要它能够获得您要求的结果。

它甚至可以外连接table以获得预期值= 1的结果。或者它可以运行select from table并将结果存储到临时表中,它可以在运行主查询时扫描

然而,最有可能的是,它为值= 1的每一行运行子查询。很难说没有看到计划。

这还取决于细节。你在进行聚合吗?如果是这样,真正的连接可能是不可能的,它可能必须重新计算每一行的答案。如果它正在查看表行上的值,那么它可能能够优化它。

如果您取出case语句,整个查询的执行速度会快得多吗?想确保分析正确的子查询。

答案 2 :(得分:0)

似乎逻辑与java中的逻辑完全一样。

我使用以下逻辑来测试您的场景:

我创建了一个虚函数,如下所示,只是在dbms_output上写一些东西,只返回10。

CREATE OR REPLACE
  FUNCTION DISP_MSG
    RETURN VARCHAR2
  AS
    ret_val VARCHAR2(20):='10';
  BEGIN
    dbms_output.enable;
    dbms_output.put_line('executed');
    RETURN ret_val;
  END DISP_MSG;

然后我创建了一个匿名块来测试它:

DECLARE
  var VARCHAR2(100);
BEGIN
  SELECT CASE WHEN (1!=1) THEN DISP_MSG ELSE '1' END INTO var FROM dual;
  dbms_output.put_line('j = '||var);
END;

输出:

  

j = 1

但是当我尝试以下内容时:

DECLARE
  var VARCHAR2(100);
BEGIN
  SELECT CASE WHEN (1=1) THEN DISP_MSG ELSE '1' END INTO var FROM dual;
  dbms_output.put_line('j = '||var);
END;

输出:

  

已执行

     

j = 10

所以很清楚什么是执行逻辑