【问题标题】:Does String concatenation in database query cause performance issues?数据库查询中的字符串连接是否会导致性能问题?
【发布时间】:2016-08-11 07:13:44
【问题描述】:

我有一个名为 T_PERSON 的表,其中包含 FIRSTNAME varchar、LASTNAME varchar、CUSTOMERTYPE int、SELLERID int 等行

此外,我还有一个像这样的人的大型“SQL IN 语句”列表

:( 'JOHNxSMITHx12345x1337', 'SARAxBANNERx7612x1337' ... ) 

即:FIRSTNAME x LASTNAME x CUSTOMERTYPE x SELLERID

如果我运行这个查询:

SELECT * FROM T_PERSON WHERE 
STR_REPLACE(FIRSTNAME + 'x' + LASTNAME + 'x' + STR(CUSTOMERID) + 'x' + STR(SELLERID)) in 
( 'JOHNxSMITHx12345x1337', 'SARAxBANNERx7612x1337' )

这个查询在一个只有几百行的小型数据库上运行良好,我想知道我是否能够在一个 T_PERSON 中包含数亿行的大型数据库上运行这个。

此查询是否会占用大量性能?例如。如果 N 是 T_PERSON 表的大小,数据库软件一般会生成 N^4 个字符串并将每个组合与列表中的所有值进行比较吗?

【问题讨论】:

  • 查询本身效率低下。您有一个客户 ID。用那个。或者创建一个 personId 并使用它。
  • 我建议阅读第三范式。 google.ie/…
  • 最好尝试使用您的数据库系统已经提供的用于处理多个数据元组的数据类型 - 表。大多数系统都会有一些方法让您使用您希望在IN 中拥有的所有数据填充一些类似临时表的数据结构,然后您可以使用JOINs 和其他基于集合的方法来编写您的查询 - 这样就更有可能使用索引,这是在性能不佳的查询中获得更好性能的主要手段。 (OTOH,确保您有实际的绩效目标并衡量
  • 产品特定问题。您使用的是哪个 dbms?
  • 代码来自 Adaptive Server Enterprise。

标签: sql database sap-ase


【解决方案1】:

我们最终选择了一个非常不同的解决方案,每行运行一个查询以进行更新。 现在我觉得自己很愚蠢,DB 中对我的 Query 进行 QA 并提出问题的人应该感到羞耻。

列名 FIRSTNAME LASTNAME 等当然都是同一个 TABLE ROW 的一部分。所以它们可以写成 THESAMEROW.FIRSTNAME、THESAMEROW.LASTNAME 等。这样看,数据库中的每一行当然只会构造一个字符串。

因此,我担心会创建 N^4 个字符串是完全错误的,我的查询将在更大的数据库上完美地线性扩展。

【讨论】:

    【解决方案2】:

    您应该尝试使用“set showplan on”或其他工具(AquaStudio、RapidSQL...)查看查询计划,看看它是否使用了索引和正确的索引。可能不是因为 WHERE 子句中的函数 str_replace。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-23
      • 1970-01-01
      • 2019-06-15
      • 2014-12-04
      • 1970-01-01
      • 1970-01-01
      • 2022-11-18
      • 1970-01-01
      相关资源
      最近更新 更多