Sql server TSQL-使用临时表优化全文搜索查询

Sql server TSQL-使用临时表优化全文搜索查询,sql-server,tsql,full-text-search,temp-tables,Sql Server,Tsql,Full Text Search,Temp Tables,简而言之,我有一个全文搜索查询,可以在单个表上搜索公司。搜索完成后,我会从结果中提取额外的统计信息,如前5名标题、前5名位置等 如何优化此查询当前在

简而言之,我有一个全文搜索查询,可以在单个表上搜索公司。搜索完成后,我会从结果中提取额外的统计信息,如前5名标题、前5名位置等

如何优化此查询当前在<25000行上执行大约需要5秒钟,并且根据执行计划,它主要在最后3条select语句上执行


SQL SERVER:2005。我可以升级到2008,但我听说SQL 2008存在更多的性能问题

非常感谢您的帮助



你的执行计划结果可能是骗人的。在SQL2005中,全文引擎是一个外部服务,因此SQL无法准确地报告这一难题中发生的事情

我不确定您在2008年听说过哪些性能问题,但在2008年,全文引擎与数据库完全集成,在您这样的情况下,将数据库表与一组全文结果合并时,效率会更高。如果升级是你的一个选择,我鼓励你去追求这个选择


请参阅:

您的执行计划结果可能具有欺骗性。在SQL2005中,全文引擎是一个外部服务,因此SQL无法准确地报告这一难题中发生的事情

我不确定您在2008年听说过哪些性能问题,但在2008年,全文引擎与数据库完全集成,在您这样的情况下,将数据库表与一组全文结果合并时,效率会更高。如果升级是你的一个选择,我鼓励你去追求这个选择


请参阅:

“但我听说SQL 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