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

Короче говоря, у меня есть полнотекстовый поисковый запрос, который выполняет поиск компании по одной таблице. После завершения поиска я извлекаю дополнительную статистику из результата, такую ​​как топ-5 названий, топ-5 локаций и т. Д.

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

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

person SQL Overload    schedule 31.01.2011    source источник
comment
но я слышал, что с SQL 2008 больше проблем с производительностью. - Какие проблемы?   -  person Mitch Wheat    schedule 31.01.2011


Ответы (1)


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

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

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

person Joe Stefanelli    schedule 31.01.2011