gpt4 book ai didi

sql-server - 通过 Sql Server 2005 中的游标更新 View (使用而不是触发器)时的性能问题

转载 作者:行者123 更新时间:2023-12-04 07:08:10 24 4
gpt4 key购买 nike

我有意见V在数据库中 D1在其中触发更新 U定义更新三个表 T1 , T2T3在数据库中 D2 .
这三个表包含 0.75、6.0 和 450 万条记录。 Sql Server 版本为 9.0.3042,开发版。

当我对上述 View 执行以下更新语句时,它会在一秒钟内准备就绪:

UPDATE V
SET cust_task_id = 11975628
WHERE custno = '0319607'

但是,当我发出以下批次时,需要一分 12 秒才能完成:
DECLARE CURSOR c
FOR SELECT custno, cust_task_id FROM V WHERE custno = '0319607'
FOR UPDATE OF cust_task_id

OPEN c
FETCH NEXT FROM c

UPDATE V
SET cust_task_id = 11975628
WHERE CURRENT OF c
CLOSE c
DEALLOCATE c

当我在 2000 版 Sql Server(8.0.2039,标准版)上使用相同的数据库(关于定义和记录数)和相同的更新语句时,两个批次都在一秒内返回!

当您查看两个版本的 Sql Server 上游标批处理的查询计划时,您会看到 2005 计划对表使用索引扫描 T1 , T2T3而 2000 计划使用索引搜索。这解释了性能的差异。

我试过 sp_updatestats在 2005 数据库上,但这没有帮助。

有没有人知道如何让 2005 光标批处理执行它应该如何?

预先感谢您抽出时间调查此事。

你好,

莱克斯·弗贝克

最佳答案

为了解决您的直接问题,不久前我们在 SQL 2000 中遇到了类似的问题,游标使用的数据源本身在游标循环期间被修改(在这种情况下,您从 V 中选择并更新 V)。从内存中(最好对此进行确认),游标的数据源已更新或重新生成,以便使数据源与所做的更改保持同步。

我们的解决方案是首先将您的数据选择到临时表或表变量中,并将其用作光标的来源。当然,您需要修改 SQL 代码以使用 ID 或其他唯一标识符进行更新,但我假设您在系统中有这些约束。

当然,听起来您的解决方案总体上确实有一些优化空间,例如游标通常不是首选方法 - 但您可能会发现上述方法使您达到可接受的性能水平,至少目前是这样。

关于sql-server - 通过 Sql Server 2005 中的游标更新 View (使用而不是触发器)时的性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/792673/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com