【发布时间】:2016-01-05 12:02:28
【问题描述】:
我正在尝试提高 Premises 表中数据的质量。
请看下面的 DDL(非常简化):
CREATE TABLE #Premises (ID int identity, Name varchar(100), primary key (ID))
INSERT INTO #Premises (name) values ('Tesco')
INSERT INTO #Premises (name) values ('Tesco Direct')
以及下面的 SQL:
select * from #Premises inner join #Premises as Premises2
ON #Premises.Name like '%' + Premises2.Name + '%'
where #Premises.ID<>Premises2.ID
这会返回一行,因为 Tesco Direct 就像 Tesco。但是,有数百万行,这显然很慢。该数据库安装在具有 SQL Enterprise 版本的服务器上。在这种情况下,全文搜索会有所帮助吗?
【问题讨论】:
-
是的。
LIKE会很慢。 -
使用 PATINDEX 可能会快一点,但无论如何字符串操作并不是性能最好的操作。
-
恕我直言,在考虑速度之前,您需要找到一种能够找到正确“欺骗”的算法。你使用like的方式不是很好。如果第一条记录有“TescoDirect”或“Tesco Direct”或只是“Tes”怎么办。就像会很慢,我认为全文也无济于事(soundex() ...函数都没有)。也许你应该想到一些 CLR 函数 - SQL server 本身在字符串操作方面很慢。
-
您是否认为“Tesco Direct”和“XYZ Tesco”也重复
-
这基本上是一个评估数十亿组合的笛卡尔连接。
标签: sql sql-server tsql