【发布时间】:2020-02-07 08:39:43
【问题描述】:
我需要搜索其 FirstName 包含在其他人的 FirstName 中(的子字符串)的人。
SELECT DISTINCT top 10 people.[Id], peopleName.[LastName], peopleName.[FirstName]
FROM [dbo].[people] people
INNER JOIN [dbo].[people_NAME] peopleName on peopleName.[Id] = people.[Id]
WHERE EXISTS (SELECT *
FROM [dbo].[people_NAME] peopleName2
WHERE peopleName2.[Id] != people.[id]
AND peopleName2.[FirstName] LIKE '%' + peopleName.[FirstName] + '%')
太慢了!我知道这是因为"'%' + peopleName.[FirstName] + '%'",因为如果我用像'%G%' 这样的硬编码值替换它,它会立即运行。
根据我的动态,我的前 10 名需要 10 秒! 我希望能够在更大的数据库上运行它。
我能做什么?
【问题讨论】:
-
在左侧使用带有通配符的
LIKE时会发生这种情况...您可以尝试在people_NAME(FirstName)上创建索引,但很可能这不会产生真正的性能差异。 -
这个查询和这个
SELECT DISTINCT top 10 p.[Id], pn.[LastName], pn.[FirstName] FROM [dbo].[people] p INNER JOIN [dbo].[people_NAME] pn on pn.[Id] = p.[Id]是一样的 -
内连接并存在于同一张表上?
-
我需要找到至少包含在另一个人的名字中的名字的人。例如,如果我有 Bob 和 Bobby,则 Bob 将是一个结果。我尝试添加一些索引但没有区别:(!
-
实际上添加硬编码值并不是加速它的原因,
like '%anything(以 % 开头)会很慢。您的硬编码值很快的原因是它在扫描早期发现了 10 个匹配项。
标签: sql sql-server tsql