1

さて、基本的には、coldfusion パワー検索のデータを返すストアド プロシージャを作成しています。

もちろん、同じ列名が返される複数のテーブルからのデータを保持するビューを作成しました。

次に、ストアドプロシージャで、このような単純な一時テーブルを作成しました....

    CREATE TABLE #TempSearchResults
(
    search_id int identity,
    id integer,
    type varchar(20),
    title varchar(50),
    url varchar(250),
    rank integer
)

次に、パフォーマンスを向上させる方法として、おそらく限られた経験で、それにインデックスを追加しました。

CREATE UNIQUE INDEX idx on #TempSearchResults (search_id)

次に、選択を大規模なクエリにしました

insert into #TempSearchResults
select id, type, title, url, rank + 1200 as rank
from my view
where company_id = @company_id
and title like @keyword
union all
select id, type, title, url, rank + 1100 as rank
from my view
where company_id = @company_id
and title like @keyword
and description like @keyword

そして、テーブル内でキーワードが見つかった場所に対して異なるランク計算値を持つように進みます。

そして最後にそれは...

select id, type, title, url, rank
from #TempSearchResults
group by id, type, title, url, rank
order by rank desc, title asc;

そのストアド プロシージャを coldfusion でテストすると、非常に時間がかかるようです。

だから私は、最適なパフォーマンスのために一時テーブルを間違って使用しているか、不完全に使用しているかのどちらかだと考えています。

または、おそらくテーブル変数に切り替える必要があります...

しかし、私はちょうど読んでいた...一時テーブルVSテーブル変数

面白いことに、このストアド プロシージャは、coldfusion を介してクエリを直接実行するよりも遅いように思われます。

最高のパフォーマンスを期待しています....

ありがとうございました...

以下は、私が使用しているビューの基本的なロジックまたはコードです。

select some field as id, some field as title, some field as description, 'url link' as url, 1 as rank
from table a
union
select some field as id, some field as title, some field as description, 'url link' as url, 1 as rank
from table b
union
select some field as id, some field as title, some field as description, 'url link' as url, 1 as rank
from table c

などなど。セキュリティ違反になるため、正確な詳細を明らかにすることはできません。それがより明確になることを願っています。

4

2 に答える 2

2

一時テーブルまたはテーブル変数を使用する必要はまったくありません。あなたはただ書くことができます

select id, type, title, url, rank
from (
    select id, type, title, url, rank + 1200 as rank 
    from my view 
    where company_id = @company_id and title like @keyword 

    union all 

    select id, type, title, url, rank + 1100 as rank 
    from my view 
    where company_id = @company_id and title like @keyword and description like @keyword
) as t
group by id, type, title, url, rank
order by rank desc, title asc;

編集:

UNION ALL を UNION に置き換えると、次のように簡略化できます。

select id, type, title, url, rank + 1200 as rank 
from my view 
where company_id = @company_id and title like @keyword 

union 

select id, type, title, url, rank + 1100 as rank 
from my view 
where company_id = @company_id and title like @keyword and description like @keyword

order by rank desc, title asc;
于 2011-02-18T18:06:24.770 に答える
0

データを選択しているテーブルでヒントを使用with (Nolock)します。アプリケーションでダーティ リードが許可されている場合は、パフォーマンスが向上する可能性があります。

于 2012-07-18T13:10:49.960 に答える