【发布时间】:2018-04-04 10:11:58
【问题描述】:
我有一个模糊匹配要求.. for 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 休息 的字段为空。
我想出了一个模糊逻辑匹配,这样如果至少一个字段是 匹配 then 'where' 子句应该通过。
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?
您能帮我看看如何提高我的查询性能还是有更好的方法来进行匹配?
【问题讨论】:
-
为什么从 T1、T2 中选择 count(*)。为什么是交叉产品?你可以使用连接吗?
-
@PraneetNadkar,OP 正在进行连接。 (旧样式,隐式连接。)
-
今日提示:切换到现代显式
JOIN语法。更容易编写(没有错误),更容易阅读(和维护),并且在需要时更容易转换为外连接。 -
我在 Oracle 上运行此查询。更新了我原来的帖子。
标签: sql oracle query-performance