在Oracle中连接两列会产生性能问题

时间:2016-07-15 14:50:28

标签: sql oracle oracle11g

我有一个select查询,我正在进行内连接,在AND子句中我正在检查这个

AND UPPER (b.a1||b.a2)  IN 
(
    select a.a1||a.a2 
    from a 
    where a.a3 = 
    (
        select  UPPER(decode('609',null,c.c1,'609'))   
        from dual
    )
)

但是因为||操作员需要超过2分钟。我们可以有任何其他解决方案吗?

3 个答案:

答案 0 :(得分:4)

如何使用EXISTS子句?

AND EXISTS (
    SELECT
        1
    FROM
        a
    WHERE
        a.a3 = (SELECT UPPER(DECODE('609',c.c1,'609')) FROM dual) -- this condition is pretty odd
        AND a.a1 = UPPER(b.a1)
        AND a.a2 = UPPER(b.a2)
)

在UPPER(b.a1)和UPPER(b.a2)上添加基于函数的索引也可能有所帮助。

说到那个奇怪的情况:(SELECT UPPER(DECODE('609',c.c1,'609')) FROM dual)

  1. 为什么要在那里执行SELECT

  2. 您检查的是 - 如果'609'等于c.c1'609'),那么a.a3必须等于'609',在任何其他情况下,SELECT { {1}}返回NULL,因此不会返回表a中的值。因此,您只需将整个条件更改为a.a3 = '609'

答案 1 :(得分:2)

尝试使用JOIN

 SELECT *
 FROM b
 JOIN ( select UPPER(a.a1), UPPER(a.a2)
        from a 
        where a.a3 = (select  UPPER(decode('609',c.c1,'609')) from dual)
      ) a
    ON UPPER(b.b1) = a.a1
   AND UPPER(b.b2) = a.a2

但问题是当你执行UPPER(b.b1)b1||b2时,你不能再使用索引了。

您可能需要function index

答案 2 :(得分:2)

您不需要连接。实际上:连接值是一个等待发生的错误:考虑表foob中的值arb以及foobar中的值aselect from dual 1}} - 串联将它们视为相同的元组,尽管它们不是。

您还不需要AND (UPPER (b.a1), upper(b.a2)) IN ( select a.a1. a.a2 from a where a.a3 = UPPER(decode('609',null,c.c1,'609')) ) 作为常量:

b(a1,a2)

b (UPPER (b.a1), upper(b.a2))上的索引不能用于此,但您可以在var err = {"success":"0","result":{},"errorMessage":"user Invalid"}, holder = document.getElementById('errorholder'); if(err.success == '0'){ holder.innerHTML = err.errorMessage; } else { // redirect using window.location } 上创建一个可以使用的索引。