TSQL - оптимизация полнотекстового поиска с помощью таблицы temp

75
7

Чтобы сделать это коротко, у меня есть текстовый поисковый запрос, который выполняет поиск компании в одной таблице. Как только поиск будет завершен, я вытащу дополнительную статистику из результата, такого как 5 лучших наименований, 5 лучших мест и т.д.


Как оптимизировать этот запрос, он в настоящее время занимает около 5 секунд для выполнения на < 25 000 строк и на основе плана выполнения, в основном, на последних 3 операторах выбора.


SQL SERVER: 2005. Я могу обновить до 2008 года, но я слышал, что с SQL 2008. возникают проблемы с производительностью.


Помощь приветствуется.


CREATE PROCEDURE [usp_Company_Search]

@KeywordNear as varchar(250),
@LocationNear as varchar(250) = null,
@PageIndex as int,
@Pagesize as int

AS

BEGIN

DECLARE @tbl TABLE
(
row int,
[Rank] int,
CompanyID int,
CompanyDesc text,
Title nvarchar(150),
Company nvarchar(150),
Category nvarchar(50),
Source nvarchar(50),
URI nvarchar(250),
Location varchar(60),
DateCreated nvarchar(50)
)

IF (@LocationNear is not null) BEGIN

WITH CompanySearch as
(
SELECT ROW_NUMBER() OVER (ORDER BY rs.rank desc) as row,
rs.Rank as [Rank],
J.CompanyID,
J.CompanyDesc,
J.Title,
J.Company,
J.Category,
J.Source,
J.URI,
J.Location,
J.DateCreated
FROM Company J
INNER JOIN
CONTAINSTABLE (Company,RawStripped, @KeywordNear) rs
ON J.Companyid = rs.[KEY] AND
CONTAINS (Location, @LocationNear)
)

insert into @tbl select * from CompanySearch

SELECT
CompanySearch.[Rank],
CompanySearch.CompanyID,
CompanySearch.CompanyDesc,
CompanySearch.Title,
CompanySearch.Company,
CompanySearch.Category,
CompanySearch.Source,
CompanySearch.URI,
CompanySearch.Location,
CompanySearch.DateCreated
FROM @tbl as CompanySearch
WHERE CompanySearch.row between (@PageIndex - 1) * @PageSize + 1 and @PageIndex*@PageSize
END
ELSE
BEGIN
WITH CompanySearch as
(
SELECT ROW_NUMBER() OVER (ORDER BY rs.rank desc) as row,
rs.Rank,
J.CompanyID,
J.CompanyDesc,
J.Title,
J.Company,
J.Category,
J.Source,
J.URI,
J.Location,
J.DateCreated
FROM Company J
INNER JOIN
CONTAINSTABLE (Company,RawStripped, @KeywordNear) rs
ON J.Companyid = rs.[KEY]
)

insert into @tbl select * from CompanySearch

SELECT
CompanySearch.Rank,
CompanySearch.CompanyID,
CompanySearch.CompanyDesc,
CompanySearch.Title,
CompanySearch.Company,
CompanySearch.Category,
CompanySearch.Source,
CompanySearch.URI,
CompanySearch.Location,
CompanySearch.DateCreated
FROM @tbl as CompanySearch
WHERE CompanySearch.row between (@PageIndex - 1) * @PageSize + 1 and @PageIndex*@PageSize

END

SELECT Max(row) as RecordCount from @tbl
select top 5 title, count(title) as cnt from @tbl group by title order by cnt desc
SELECT top 5 Location, count(location) as cnt from @tbl group by location order by cnt desc
SELECT top 5 Company, count(company) as cnt from @tbl group by company order by cnt desc

END

спросил(а) 2021-01-19T18:45:39+03:00 2 месяца, 3 недели назад
1
Решение
87

Результаты вашего плана выполнения могут обманывать. В SQL 2005 полнотекстовый движок является внешней службой, поэтому SQL не может точно сообщить о том, что происходит в этой части головоломки.


Я не уверен, какие проблемы с производительностью вы слышали в 2008 году, но в 2008 году полнотекстовый движок полностью интегрируется с базой данных, что делает его намного более эффективным в случае, таком как ваш, где вы присоединяетесь к таблице базы данных против набора полнотекстовых результатов. Если обновление является для вас вариантом, я бы рекомендовал вам использовать этот вариант.

Смотрите: Полнотекстовый поиск SQL Server 2008: внутренние и улучшения

ответил(а) 2021-01-19T18:45:39+03:00 2 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема