我有一个查询,使用带有通配符的“like”搜索客户端。例如:
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')
它还可以在“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')
有人能说出优化此类查询性能的最佳方法是什么?也许我需要创建一个索引?该表可以生产多达1000K的记录。
答案 0 :(得分:8)
要为模式具有LIKE
格式的'%XXX%'
做很多事情,您需要查找SQL Server的全文索引功能,并使用CONTAINS
代替{{1} }}。按原样,你正在进行全表扫描,因为普通索引无法帮助搜索以通配符开头的项目 - 但是全文索引会出现。
LIKE
答案 1 :(得分:-1)
看起来有些数据库(PostgreSQL 7.1 +,MySQL v3.23.23 +,Microsoft-SQL v ???)已经包含了这样的东西:
MySQL>> ALTER TABLE articles ADD FULLTEXT(body, title); MySQL>> SELECT * FROM articles WHERE MATCH(title, body) AGAINST ('PHP')
MS-SQL>> SELECT ProductName FROM Products WHERE FREETEXT (ProductName, 'spread' )
PgSQL>> CREATE FUNCTION fti() RETURNS opaque AS '/path/to/fti.so' LANGUAGE 'C'; PgSQL>> CREATE TABLE articles_fti (string type, id oid); ....Oracle...,Sybase...