【问题标题】:TSQL - Optimizing Full Text Search query with temp tableTSQL - 使用临时表优化全文搜索查询
【发布时间】:2011-01-31 02:07:51
【问题描述】:

为了简短起见,我有一个全文搜索查询,它在单个表上进行公司搜索。搜索完成后,我会从结果中提取额外的统计信息,例如前 5 个标题、前 5 个位置等...

如何优化此查询,目前在

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

【问题讨论】:

  • “但我听说 SQL 2008 存在更多性能问题。” - 什么问题?

标签: sql-server tsql full-text-search temp-tables


【解决方案1】:

您的执行计划结果可能具有欺骗性。在 SQL 2005 中,全文引擎是一个外部服务,因此 SQL 无法准确报告该拼图中发生的情况。

我不确定您在 2008 年听说过哪些性能问题,但在 2008 年,全文引擎与数据库完全集成,在您加入数据库表的情况下效率更高针对一组全文结果。如果升级是您的选择,我鼓励您选择该选项。

见:SQL Server 2008 Full-Text Search: Internals and Enhancements

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-18
    • 1970-01-01
    • 2018-02-23
    • 1970-01-01
    • 2015-11-19
    • 2021-05-19
    相关资源
    最近更新 更多