避免使用START WITH ..先前连接

时间:2012-12-17 17:48:58

标签: sql oracle

我有一个在WHERE子句中调用函数的查询,如

SELECT * FROM table_name t WHERE (SELECT xyz_function(t.test) FROM dual) = 'A';

函数xyz_function根据以下条件返回'A'或'B':

SELECT 'A' FROM dual WHERE pTest NOT IN (
                                         a_START_WITH_CONNECT_BY_CLAUSE
                                         MINUS
                                         b_START_WITH_CONNECT_BY_CLAUSE);

这里pTest是我传递给函数的参数。 我在函数中使用了两个START WITH.. CONNECT BY PRIOR子句。

由于在WHERE子句中调用了该函数,所以对所有t.test执行它。

该查询提供了近20K的记录,因此超时。

由于函数中的START WITH.. CONNECT BY子句,查询似乎超时了。

任何人都可以帮我删除START WITH .. CONNECT WITH子句吗??

1 个答案:

答案 0 :(得分:2)

会...

SELECT
    *
FROM 
    table_name t 
WHERE 
    t.test NOT IN 
    (
        a_START_WITH_CONNECT_BY_CLAUSE
        MINUS
        b_START_WITH_CONNECT_BY_CLAUSE
    );

...相当于你目前的情况?如果没有看到你的表,函数和CONNECT BY子句的样子,很难说。但是,如果它是等效的,则可能会获得更好的性能,因为可能不需要在每一行上评估MINUS查询。