Oracle - SQL语句性能不佳 - 模糊匹配逻辑

时间:2018-04-04 10:11:58

标签: sql oracle query-performance

我有一个模糊匹配要求..对于ex;

Table1 - T1Col1, T1col2, T1col3, T1col4, T1col5. 
Table 2 - T2Col1, T2col2, T2col3, T2col4, T2col5. 

所以我的要求是

  • T1 - 不需要所有字段,即T1col1,T1col2,T1col3,T1col4, T1col5不是空值,但有T1Col2的情况 填充并且T1Col3,T1Col4和5为空。最佳案例场景 是所有字段都不是空的,最坏的情况是除了T1Col1休息 这些字段是空的。

  • 我想出了一个模糊逻辑匹配,以便至少有一个字段 然后匹配'其中'条款应该通过。

select count(*) from T1, T2
where
  Nvl(T1COl1, nvl(T2Col1, 'x')) = nvl(T2Col1, 'x') and
  Nvl(T1COl2, nvl(T2Col2, 'x') ) = nvl(T2Col2, 'x') and
  Nvl(T1COl3, nvl(T2Col3, 'x'))  = nvl(T2Col3, 'x') and
  Nvl(T1COl4, nvl(T2Col4, 'x')) = nvl(T2Col4 'x') and
  and substr(T1COl5, 1,1) = T2Col5
  ;

T1和T2中的记录计数分别为243000和55000条记录 当我运行上述语句时,需要1426.809秒,并给了我11349条记录。看起来性能很差。 是因为在where子句中使用substr或使用了太多的NVL?

您能在这里帮助我如何提高查询效果,还是有更好的方法进行匹配?

1 个答案:

答案 0 :(得分:0)

也许只是个人偏好,但我会把它写成:

select count(*)
  from t1
      ,t2
 where (t1col1 is null or t1col1 = t2col1)
   and (t1col2 is null or t1col2 = t2col2)
   and (t1col3 is null or t1col3 = t2col3)
   and (t1col4 is null or t1col4 = t2col4)
   and substr(t1col5, 1, 1) = t2col5;
  • 更清楚的逻辑,即t1列中的空值是正确的。
  • 无需进行任何必要的计算
  • 尽可能利用列上的索引。

此查询中的逻辑略有不同。此查询与值' x'不匹配。在t1col1中为t2col1中的空值。