0

嗨,我有一个非常慢的 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 语句为假,那么它里面的部分永远不会被处理,那么我想知道的是它在 oracle SQL 中是否也相同。

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

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

还是采用以下逻辑:

  • 预处理所有子查询
  • 检查案例条件
  • 如果为真,则显示在输出内部
  • 否则显示其他输出。

请帮忙

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

我需要知道的是 case 条款是如何一步一步地工作的。

如果有人对此有一些意见,请分享

4

3 回答 3

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>
于 2013-03-13T12:21:18.997 回答
0

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

它甚至可以通过外连接table来获得预期值 = 1 的结果。或者它可以运行从表中选择并将结果存储到一个临时表中,它可以在运行主查询时扫描该临时表。

然而,最有可能的是,它正在为 value = 1 的每一行运行子查询。如果没有看到计划,很难判断。

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

如果去掉 case 语句,整个查询是否执行得更快?想要确保您正在分析正确的子查询。

于 2013-03-13T12:21:44.220 回答
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

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

于 2013-03-13T12:39:54.223 回答