是concat()恶化了我的SQL查询的性能?

时间:2014-10-09 17:06:00

标签: sql join teradata

我有几十个表,我必须经常使用三个字符串字段加入。

f1,f2和f3始终不为空,并且每个都有固定数量的字符。

我知道这不是最优,但我只能查询数据库,我不负责设计。

我用于查询的条件是:

concat(table1.f1, table1.f2, table1.f3) = concat (table2.f1, table2.f2, table2.f3)

这些查询针对的是具有数百万个注册表的数据库,因此查询总是需要几分钟。

但是低头,我想如果我写下面的内容,或许联接更快?

table1.f1 = table2.f1
and table1.f2 = table2.f2
and table1.f3 = table2.f3

我在想,也许数据库可以利用索引只连接所需的行?

有时我对必须连接的行非常严格,但我认为在连接查询中,所有行始终匹配,并且一旦表连接就会丢弃行。

如果我知道table2.f6 ='whatever'和table2.f7 ='what'等,那么查询是否会连接所有行然后丢弃其中的大多数行是否有意义?

因为我认为以下三个查询是相同的,就它们的最佳程度而言。我是对的吗?

SELECT ...
FROM table1
INNER JOIN table2
ON table1.f1 = table2.f1
    and table1.f2 = table2.f2
    and table1.f3 = table2.f3
and table2.f6 = 'whatever here'



SELECT ...
FROM table1
INNER JOIN table2
ON table1.f1 = table2.f1
    and table1.f2 = table2.f2
    and table1.f3 = table2.f3
WHEN table2.f6 = 'whatever here'



SELECT ...
FROM table1, table2
WHEN table1.f1 = table2.f1
    and table1.f2 = table2.f2
    and table1.f3 = table2.f3
    and table2.f6 = 'whatever here'

那么,我是否应该使用concat,以及限制连接查询中的行以使其更快的最佳方法是什么?

谢谢!

1 个答案:

答案 0 :(得分:3)

隐藏任何加速/效率,请注意进行批量连接比较v.s.个人比较给你错误/无效的结果:

给出四个字段及其值:

w      x            y    z
-----------------------------
abcd   ef           ab   cdef

并且您将w / x对与y / z进行比较,然后:

concat(w,x) == concat(y,z)                (w == y) && (x == z)
'abcd' + 'ef' == 'ab' + 'cdef'            ('abcd' == 'ab') && ('abcd' == 'ef')
'abcdef' == 'abcdef'                      false && false
TRUE                                      FALSE