У меня есть запрос, который ищет клиенты, использующие "как" с подстановочным знаком. Например:
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')
Это может также использовать меньше параметров в "где" пункт, например:
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 в производстве.
Чтобы сделать многое для LIKE
, где шаблон имеет форму '% XXX%'
, вам нужно найти возможности полнотекстового индексирования SQL Server и использовать СОДЕРЖИТ
вместо КАК
. Как есть, вы выполняете полное сканирование таблицы, потому что обычный индекс не поможет при поиске элемента, который начинается с подстановочного знака, а полнотекстовый индекс поможет.
/* ... */
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')
Похоже например, некоторые базы данных (PostgreSQL 7.1+, MySQL v3.23.23 +, Microsoft-SQL v ???,) уже содержат такие вещи:
MySQL >> ALTER TABLE article ADD FULLTEXT (body, title);
MySQL >> SELECT * FROM article WHERE MATCH (title, body) AGAINST ('PHP')
MS-SQL >> SELECT ProductName FROM Products WHERE FREETEXT (ProductName, 'spread')
PgSQL >> CREATE FUNCTION fti () ВОЗВРАЩАЕТ непрозрачный AS '/path/to/fti.so' LANGUAGE 'C';
PgSQL >> СОЗДАТЬ ТАБЛИЦУ article_fti (тип строки, id oid);
.... {{ 1}}
Oracle ... , Sybase ...