SQL Server:如何优化"喜欢"查询?

and*_*111 3 sql sql-server sql-server-2005

我有一个查询,使用通配符"喜欢"搜索客户端.例如:

SELECT TOP (10) 
       [t0].[CLIENTNUMBER], 
       [t0].[FIRSTNAME], 
       [t0].[LASTNAME], 
       [t0].[MI], 
       [t0].[MDOCNUMBER]
  FROM [dbo].[CLIENT] AS [t0]
 WHERE (LTRIM(RTRIM([t0].[DOCREVNO])) = '0') 
   AND ([t0].[FIRSTNAME] LIKE '%John%') 
   AND ([t0].[LASTNAME] LIKE '%Smith%') 
   AND ([t0].[SSN] LIKE '%123%') 
   AND ([t0].[CLIENTNUMBER] LIKE '%123%') 
   AND ([t0].[MDOCNUMBER] LIKE '%123%') 
   AND ([t0].[CLIENTINDICATOR] = 'ON')
Run Code Online (Sandbox Code Playgroud)

它还可以在"where"子句中使用较少的参数,例如:

SELECT TOP (10) 
       [t0].[CLIENTNUMBER], 
       [t0].[FIRSTNAME], 
       [t0].[LASTNAME], 
       [t0].[MI], 
       [t0].[MDOCNUMBER]
  FROM [dbo].[CLIENT] AS [t0]
 WHERE (LTRIM(RTRIM([t0].[DOCREVNO])) = '0') 
   AND ([t0].[FIRSTNAME] LIKE '%John%') 
   AND ([t0].[CLIENTINDICATOR] = 'ON')
Run Code Online (Sandbox Code Playgroud)

任何人都能说出优化此类查询性能的最佳方法是什么?也许我需要创建一个索引?该表在生产中最多可以有1000K记录.

Jer*_*fin 9

要为LIKE模式具有表单的位置做很多事情'%XXX%',您需要查找SQL Server的全文索引功能,而CONTAINS不是使用LIKE.原样,你正在进行全表扫描,因为普通索引无法帮助搜索以通配符开头的项目 - 但是全文索引会.

/* ... */
 WHERE (LTRIM(RTRIM([t0].[DOCREVNO])) = '0') 
   AND (contains([t0].[FIRSTNAME], 'John')) 
   AND (contains([t0].[LASTNAME], 'Smith')) 
   AND (contains([t0].[SSN], '123'))
   AND (contains([t0].[CLIENTNUMBER],'123')) 
   AND (contains([t0].[MDOCNUMBER], '123')) 
   AND ([t0].[CLIENTINDICATOR] = 'ON')
Run Code Online (Sandbox Code Playgroud)

  • +1,除非您不清楚全文索引是否按计划(异步)更新,而不是“插入/更新/删除”(同步)。 (2认同)