gpt4 book ai didi

sql-server - 是否可以优化或重写此游标以获得最佳性能?

转载 作者:太空狗 更新时间:2023-10-30 02:00:52 25 4
gpt4 key购买 nike

需要更新我们服务器上的所有数据库并在每个数据库上执行相同的逻辑。有问题的数据库都遵循一个通用的命名方案,如 CorpDB1、CorpDB2 等。我没有为每个有问题的数据库(超过 50 个)创建 SQL 代理作业,而是考虑使用游标遍历数据库列表然后对每个执行一些动态 sql。鉴于游标应该是最后手段的普遍观念;这是否可以重写以获得更好的性能,或者可能使用未记录的 sp_MSforeachdb stored procedure 以其他方式编写?

DECLARE @db VARCHAR(100) --current database name
DECLARE @sql VARCHAR(1000) --t-sql used for processing on each database

DECLARE db_cursor CURSOR FAST_FORWARD FOR
SELECT name
FROM MASTER.dbo.sysdatabases
WHERE name LIKE 'CorpDB%'
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @db
WHILE @@FETCH_STATUS = 0
BEGIN
SET @sql = 'USE ' + @db +
' DELETE FROM db_table --more t-sql processing'
EXEC(@sql)
FETCH NEXT FROM db_cursor INTO @db
END
CLOSE db_cursor
DEALLOCATE db_cursor

最佳答案

当使用游标来解决带有过程代码的基于集合的问题时,游标是不好的。我认为游标在您的场景中不一定是个坏主意。

当需要对多个数据库运行操作(备份、完整性检查、索引维护等)时,使用游标没有问题。当然,您可以构建一个包含数据库名称的临时表并循环遍历它……但这仍然是一种过程方法。

对于您的特定情况,如果您不根据某些 WHERE 子句标准删除这些表中的行,请考虑使用 TRUNCATE TABLE 而不是 DELETE FROM 。两种操作之间的差异解释 here .请注意,运行 TRUNCATE TABLE 的用户需要对受影响的对象具有 ALTER 权限。

关于sql-server - 是否可以优化或重写此游标以获得最佳性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9197760/

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