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 回答
0

重构你的代码逻辑怎么样?

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

IF NOT EXISTS (select *
    from tbl_share ts
    where ts.user_id = @TO_ID)
BEGIN

    update tbl_share
    set user_id = @TO_ID 
    where user_id = @FROM_ID

END

因此,您要事先进行检查,并且仅在需要时才更新数据库。

高温高压

于 2013-06-04T12:54:58.867 回答