【问题标题】:sql server update affects 0 records but fills transaction logsql server update 影响 0 条记录但填满事务日志
【发布时间】:2013-09-11 13:09:26
【问题描述】:

如果查询返回任何记录,我有一条 SQL 语句会更新表中的记录。查询仅在需要更新时才返回记录。当我在查询上运行选择时,我没有得到任何记录,所以当更新运行时应该没有更新记录。

我遇到的问题是存储过程中的查询不会完成,因为在查询完成之前事务日志已填满。我不担心交易日志现在会填满。

我的问题是,如果没有记录被更新,那么为什么要写入事务日志?

【问题讨论】:

  • 桌上有UPDATE触发器吗?
  • 您遇到什么错误?您确定它正在填充事务日志而不是 tempdb?
  • 哪些操作会填满日志?具体来说,使用SELECT ... FROM fn_dblog(...)查询时会出现什么样的LOP_XXX操作?
  • 可能 tempdb 的日志已满。请发布完整的错误消息。
  • 这可能是由于执行时的查询计划不正确。如果您的表被索引,请确保您的查询设置为使用它们,如果没有,您应该考虑在查询中的列上添加一些非聚集索引。

标签: sql sql-server transaction-log


【解决方案1】:

我们需要更多信息才能解决这个问题...

Remus 有一个好主意来查看日志文件中的条目。

执行 DBCC SQLPERF(logspace) 会告诉你日志文件有多满。

使用事务日志备份清除日志文件。这是假设恢复模式为 FULL 且已完成 FULL 备份。

重新运行更新存储过程。查看事务日志文件条目。

存储过程和表定义的副本会很棒。在执行期间寻找可能填满日志的其他进程 (sp_who2) 是另一个好地方。

Martin 建议,任何可能导致更新、删除或插入的触发器都可以增加日志文件的大小。

祝你好运。

【讨论】:

  • 看起来问题出在加入中。加入这么多记录太累了,tempdb 已经填满了驱动器上没有更多空间的地步。
【解决方案2】:

看起来问题出在加入中。加入这么多记录太累了,tempdb 已经填满了驱动器上没有更多空间的地步。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-08
    • 1970-01-01
    • 2010-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-23
    相关资源
    最近更新 更多