更清洁的实现,而不是使用LIKE

时间:2011-12-06 10:48:30

标签: performance sql-server-2008

我有一个包含以分号分隔的电子域名的表格。

Domain
------
gmail.com;googlemail.com
hotmail.com;hotmail.co.uk;live.co.uk

我目前正在运行以下SQL:

SELECT [Id]
  FROM [DomainGroup]
 WHERE [Domain] LIKE '%' + (SELECT RIGHT('anemail@gmail.com', CHARINDEX('@', REVERSE('anemail@gmail.com')) - 1)) + '%'

虽然这很有效,但我认为从性能和可读性来看,使用PATINDEX会更好。电子邮件地址实际上是一个变量,但我已经把它放进去展示我想要实现的目标。

2 个答案:

答案 0 :(得分:0)

我认为PATINDEXLIKE的性能优势充其量只是ambiguous,特别是在您的情况下,将分隔值规范化为索引列中的各个行会产生更多性能提升超过其他任何因素。

如果你不能改变设计和想要使用PATINDEX,那么我会预先计算模式;

declare @emaildomain varchar(128) = 'anemail@gmail.com'
set @emaildomain = '%;' + stuff(@emaildomain, 1, charindex('@', @emaildomain), '')  + ';%'

然后在where子句中使用它;

where patindex(@emaildomain, ';' + [Domain] + ';') > 0

(我使用;分隔符填充,因此aaa@bbb.comaaabbb.com;不匹配)

答案 1 :(得分:0)

您是否考虑过使用全文搜索?

创建索引后,查询将如下所示:

SELECT [Id] FROM [DomainGroup] WHERE CONTAINS ([Domain], 'gmail.com')