2011-01-31 24 views
0

短くするために、単一のテーブルで会社検索を行うフルテキスト検索クエリがあります。検索が完了したら、上位5タイトル、上位5位などの結果から余分な統計情報を取得します。TSQL - 一時テーブルを使用した全文検索クエリの最適化

このクエリを最適化するには、現在どのように実行するのが約5秒かかります。< 25,000行実行計画は主に最後の3つの選択ステートメントに基づいています。

のSQL SERVER:2005年は、私が2008にアップグレードすることができますが、私は2008年

ヘルプが大幅に高く評価されるSQLでより多くのパフォーマンスの問題があると聞きました。


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 
+1

「が、私は、SQL 2008でより多くのパフォーマンスの問題があると聞きました」 - 何の問題は? –

答えて

3

あなたの実行計画の結果を欺くことができます。 SQL 2005では、フルテキストエンジンは外部サービスなので、SQLはそのパズルの中で何が起こっているかを正確に報告することはできません。

2008年に聞いたことのあるパフォーマンス上の問題はよく分かりませんが、2008年にはフルテキストエンジンが完全にデータベースに統合され、データベースに参加しているような場合テーブルを全文検索結果のセットと照合する。アップグレードがオプションの場合は、そのオプションを追求することをお勧めします。

参照:SQL Server 2008 Full-Text Search: Internals and Enhancements

関連する問題