【问题标题】:is concat() worsening the performance of my sql queries?concat() 会恶化我的 sql 查询的性能吗?
【发布时间】:2014-12-04 17:15:08
【问题描述】:

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

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='whatever' 等,那么查询连接所有行然后丢弃大部分行是否有意义?

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

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 还是不使用,以及限制连接查询中的行以使其更快的最佳方法是什么?

谢谢!

【问题讨论】:

  • 是的,这样的连接会阻止索引的使用,这意味着数据库必须从字段中创建新字符串,比较这些字符串,然后丢弃字符串。
  • 你能不能给我一些参考,用一个不容置疑的参考来警告我的同事?
  • @user4126054 您要查找的词是sargable
  • 您使用 Teradata 标记了您的问题,但 CONCAT 在 Teradata 中不是有效的语法。关于这三种变体,它们都将返回相同的结果并且应该具有完全相同的计划(只要您不使用外连接)
  • 毫无疑问,concat(string1, string2, ...) 在我的 Teradata SQL 助手中有效。

标签: sql join teradata


【解决方案1】:

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

给定四个字段及其值:

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

【讨论】:

  • @Marc B:在我最初的问题中,我说:“f1、f2 和 f3 始终不为空,并且它们每个都有固定数量的字符”。所以这个例子永远不会出现在我的数据库中:w 和 y 的字符数相同,x 和 z 对也一样。
  • @user4126054 现在它们不是空值和固定大小。数据(和表)结构往往会随着时间而改变。当他们会(他们会,这只是时间问题)时,您的查询不会中断,无效或其他任何事情 - 这是这里最大的陷阱 - 它只会为您提供无效数据,您将永远找不到出来吧。
猜你喜欢
  • 2013-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-28
  • 1970-01-01
  • 2021-09-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多