2

750,000 エントリを含むテーブルでクエリを実行すると、パフォーマンスの問題が発生します。実行には 15 ~ 20 秒かかり、その間データベースへのアクセスがブロックされ、大量のエラー ログが作成されます (もちろん、怒っている顧客もいます)。

クエリは次のとおりです。

DECLARE @FROM_ID AS UNIQUEIDENTIFIER = 'XXX'
DECLARE @TO_ID AS UNIQUEIDENTIFIER = 'YYY'

update tbl_share
set user_id = @TO_ID 
where user_id = @FROM_ID
and not exists (
    select *
    from tbl_share ts
    where ts.file_id = file_id
    and ts.user_id = @TO_ID
    and ts.corr_id = corr_id
    and ts.local_group_id = local_group_id
    and ts.global_group_id = global_group_id 
)

TSQL の知識が限られているため、現在は行き詰まっています。私は疑問に思っています:

  • 一時テーブルを作成する必要があります
  • 「*」以外を選択する必要があります

これは本番データベースであり、日中は常時 10 ~ 20 人の顧客が接続しているため、テストを実行する機会はあまりありません。

ご協力いただきありがとうございます!

4

2 に答える 2

0

選択の最適化から始めましょう。
クエリ プランを確認します。
それが PK の場合、フラグメント化されていますか?

select * 
from tbl_share
where user_id = @FROM_ID
and not exists (
    select *
    from tbl_share ts
    where ts.file_id = file_id
    and ts.user_id = @TO_ID
    and ts.corr_id = corr_id
    and ts.local_group_id = local_group_id
    and ts.global_group_id = global_group_id 
    )

select tUpdate.* 
from tbl_share as tUpdate
left outer join tbl_share as tExists 
  on tUpdate.user_id = @FROM_ID
 and tExists.user_id = @TO_ID
 and tExists.file_id = tUpdate.file_id
 and tExists.corr_id = tUpdate.corr_id
 and tExists.local_group_id = tUpdate.local_group_id
 and tExists.global_group_id = tUpdate.global_group_id 
where tExists.user_id is null 
于 2013-06-04T13:45:35.217 に答える