Нечеткая оптимизация поиска в SQL Server

#sql #performance #tsql #query-optimization #sql-execution-plan

#sql #Производительность #tsql #оптимизация запросов #sql-план выполнения

Вопрос:

Я пытаюсь оптимизировать производительность хранимой процедуры. Мне нужно выполнить поиск в двух столбцах с помощью оператора LIKE. Вот таблица поиска

 CREATE TABLE [dbo].[PrincipalDiagnosis](
        [PrincipalDiagnosisID] [int] IDENTITY(1,1) PRIMARY KEY NOT NULL,
        [Code] [varchar](10) NULL,
        [PrincipalDiagnosisDescription] [varchar](3500) NULL,
   )
 

Я создал два независимых НЕКЛАСТЕРИЗОВАННЫХ индекса для столбцов [Code] и [PrincipalDiagnosisDescription]. Вот запрос хранимой процедуры:

 SELECT RTRIM(LTRIM(Item)) AS SearchItem
    INTO #SearchItems
    FROM dbo.SplitString(@SearchQuery, ' ')
    WHERE RTRIM(LTRIM(Item))<>''

SELECT TOP (100) PrincipalDiagnosisID, 
    ISNULL(Code  ' '  PrincipalDiagnosisDescription, '') AS Info       
FROM dbo.PrincipalDiagnosis
WHERE EXISTS (
            SELECT 1
            FROM #SearchItems
            WHERE Code LIKE '%' SearchItem '%'
            OR PrincipalDiagnosisDescription LIKE '%' SearchItem '%'
         )
ORDER BY 2
 

СУЩЕСТВУЮЩАЯ часть занимает так много времени. В плане выполнения есть сканирование таблицы #SearchItems.
Я использую SQL server 2014 Enterprise edition. Я хочу оптимизировать этот запрос настолько, насколько смогу. Я буду признателен за ваши ценные предложения.
Спасибо!
Мухаммад

План выполнения

Комментарии:

1. Эти два NONCLUSTERED индекса никогда не будут использоваться из-за ведущего % LIKE оператора

2. ДА. Я могу понять недостаток% в начале SearchIte. Но для searchItem требуется префикс %.

3. Рассмотрите возможность использования полнотекстового поиска.

4. Переместите записи временной таблицы в физическую таблицу и реализуйте FULL TEXT SEARCH это единственный способ оптимизировать ваш запрос

5. Как выглядят ваши данные. Полный текст не может быть ответом.