【问题标题】:SQL Server 2008: is there a way to avoid writing to transaction log?SQL Server 2008:有没有办法避免写入事务日志?
【发布时间】:2011-04-14 16:59:45
【问题描述】:

虽然我的查询是正确的,但我会间歇性地收到此错误。有没有办法避免写入事务日志?

当我检查指定的列时,每一列的文字都写着:“Nothing”

错误:

数据库的事务日志 “tempdb”已满。找出原因 日志中的空间不能重复使用,请参阅 log_reuse_wait_desc 列 sys.databases”。

谢谢,非常感谢,有点急。

【问题讨论】:

    标签: sql sql-server-2008 ssis


    【解决方案1】:

    您需要使用事务日志。这是在发生错误或查询部分完成时 SQL 回滚的方式。

    根本原因不是事务日志,而是查询。你要么:

    1 - 查询优化不佳(大量排序或哈希连接可能导致此问题)

    2 - 在您的查询中过度使用 #temp 表

    3 - 存在驱动器空间问题

    你能发布你正在运行的查询吗?

    编辑:

    澄清可能导致问题的原因...

    如果您有多个 #temp 表,它们都会占用 tempdb 中的空间。查询引擎必须进行的任何排序
    ORDER BY 没有索引,复杂的JOIN 条件不使用索引,大量GROUP BY 或聚合函数等)
    写入tempdb 的事务日志,因为所有排序都在那里完成。

    查询本身可能功能正常,但可能需要对其进行优化以避免这些问题。

    【讨论】:

    • 查询本身没问题,我只是在处理180万条记录
    • @William - 如果查询本身没问题,您可以处理 18m 条记录而不会出现 tempdb 溢出。我每个月为一个数据集处理 7 亿条记录,没有这个问题。
    • 查询没有使用连接,但是它使用了游标
    • @William - 你会发现游标由于性能不佳而几乎受到普遍谴责。如果您需要帮助优化它以不使用光标,我想您可能会找到一些帮助,如果您打开一个新问题。
    • 我对此持开放态度,并将作为新问题重新发布。
    【解决方案2】:

    不,每笔交易都会被记录下来。但是,这不是日志记录的问题。

    它表明 tempdb 已满,而不是您的日志文件。您正在处理大量记录吗?使用临时表?

    您需要管理增长,因为您可能需要批量处理并更频繁地提交。

    【讨论】:

    • @William - 请发布您的表结构和查询。
    • @William,你的 tempdb 文件有多少磁盘空间?
    【解决方案3】:

    SQL Server 使用事务日志来跟踪它所做的事情,没有办法避免这种情况(出于很多原因,您也不想这样做)。问题是这样的:

    • temdb 是 sql server 中的一个系统 DB,sql server 使用它来写入临时数据,例如用于非常长的查询的缓存数据和临时表(以 #、## 作为前缀创建的任何表)。

    • 当您第一次安装 sql server 时,它会在所有数据所在的驱动器上创建 tempdb。

    • 当您运行执行临时表或长时间运行的查询时,缓存的数据会写入 tempdb - 当它这样做时,它还固有地使用 tempdb 的事务日志。

    在您的情况下,数据库的日志文件被填满可能是因为有太多数据被缓存/写入 tempdb,并且 tempdb 日志文件的驱动器可能已满。你的 tempdb 应该有 'shrink automatic' 选项 'on',为了轻松解决这个问题,你可以重新启动 sql 服务,它会自动消除 tempdb 日志文件中的额外数据。

    您可以尝试稍微调整一下您的查询,这样就不必向 tempdb 写入太多数据(消除长结果集。避免使用 #temptables 等)

    【讨论】:

    • 'shrink automatically' option 'on' 在包括tempdb在内的任何数据库上不是一个好习惯
    • 当有其他因素导致 tempdb 扩展时,它是一种故障保护措施。当 tempdb 增长时,DB 的整体性能呈指数级下降。自动收缩有助于保持其余事务顺利执行。
    【解决方案4】:

    只是为了验证 tempdb 问题,在您的 JOINS 中,强制 LOOP join ex: 从测试中选择 * 内环连接 测试2 在 x=y 上

    并删除所有 ORDER BY 子句。

    如果查询运行时没有填充您的 tempdb(但可能会慢很多),那么您就知道需要散列(或排序)并且使用了过多的 tempdb 空间。

    可能需要良好的查询分析来解决这个问题,但请检查执行计划并尝试尽一切可能删除任何排序或哈希连接,如果可能通过创建索引或有时强制连接类型(但通常如果统计很好,您应该仅作为最后一种可能性这样做)。

    祝你好运

    【讨论】:

      猜你喜欢
      • 2015-03-05
      • 2010-11-15
      • 2014-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多