#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. Как выглядят ваши данные. Полный текст не может быть ответом.