SQL Server更有效的子字符串

时间:2018-09-07 10:03:15

标签: sql sql-server tsql

我正在SQL Server中运行查询,在此查询中,我需要将两个表连接到一个表中,在其中删除撇号后,全名字段与另一名中的部分名称字段匹配。对于一个代码示例,连接是这样发生的:

from [Data1]
right join [Data2]
    on replace([Data2].[PartialName], '''','')=Substring([Data1].[FullName],1,1+LEN(replace([Data2].[PartialName], '''','')))

它有效。但是,如果我们只使用name = name的地方,大约需要20分钟,那么这将花费10秒的时间。就运行时间而言,这是相当不可接受的,因此我想知道是否有人可以考虑使用更有效的替代方法。

Btw数据1大约有800行,而数据2大约有160万行。

编辑:有人告诉我我需要提供更多描述性信息。基本上在此示例中,Data1是来自外部源的表,该表包含名称字段[FullName],该字段包含形式为“姓氏,名字中间名”的人们的全名,其中所有撇号都已删除(对于以O'Neil的名称为例)。 因此,例如“ ONeil,Sarah Conner”

Data2包含一个名称字段,该名称字段的名称格式为“姓氏,名字”,中间名被省略,撇号完整无缺。例如'O'Neil,Sarah'

这些表需要在它们的名称字段上合并在一起,因此具有上述逻辑。

1 个答案:

答案 0 :(得分:3)

DavidG是正确的,这里有一个PERSISTED列。喝了一点咖啡后,我认为您需要计算列,然后在LIKE中输入JOINPERSISTED列的SQL类似于:

ALTER TABLE [Data2] ADD PartialName_na AS REPLACE(PartialName,'''','') PERSISTED;

可能希望将其添加到索引中。然后,您的新(伪)SQL查询将是:

SELECT ...
FROM Data2 D2
     LEFT JOIN Data1 D1 ON D1.FullName = D2.PartialName_na + '%';

无需使用SUBSTRINGLIKE将在此处保持SARGability,不会使用前导通配符。

编辑:几个注释。我使用_na后缀表示“禁止撇号”;您可以根据需要调用该列。我还将查询从RIGHT JOIN更改为LEFT JOIN。我个人认为LEFT JOIN很容易阅读,但是,如果您想把它换回来,请放心。