【发布时间】: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。