【发布时间】:2014-01-08 18:54:39
【问题描述】:
我遇到了一个看起来很简单的查询问题,但它在我的开发环境中给我带来了很多问题。
我正在尝试将 articleID 更改为我在新表中拥有的新文章 ID。
+-----------------+ |厘米 | +-----------------+ |西德 |文章ID | +-----------------+ | 1 | 1 | +-----------------+ | 2 | 1 | +-----------------+ | 3 | 2 | +-----------------+ +------------------------+ | new_cmets | +------------------------+ |评论 ID |文章ID | +------------------------+ | 1 | 10 | +------------------------+ | 2 | 10 | +------------------------+ | 3 | 32 | +------------------------+我希望表格“cmets”的结尾如下:
+-----------------+ |厘米 | +-----------------+ |西德 |文章ID | +-----------------+ | 1 | 10 | +-----------------+ | 2 | 10 | +-----------------+ | 3 | 32 | +-----------------+所以我执行这个查询:
UPDATE comments SET comments.articleID = new_comments.articleID_new
FROM comments INNER JOIN new_comments
ON comments.cid = new_comments.comment_id;
问题是我在磁盘中有 20GB 的可用空间,当我执行此查询时,事务日志开始增长并在查询完成之前使用所有可用空间。 6 分钟后,磁盘的 20GB 可用空间就消失了。
我已将恢复模式更改为简单。但是,问题仍然存在,并且事务日志不断增长。
我可以使用我在 stackoverflow 中看到的下一个查询看到数据库的事务日志在增长:
SELECT (size * 8.0)/1024.0 AS size_in_mb,
CASE
WHEN max_size = -1 THEN 9999999 -- Unlimited growth, so handle this how you want
ELSE (max_size * 8.0)/1024.0
END AS max_size_in_mb
FROM MyDatabase.sys.database_files
WHERE data_space_id = 0;
有谁知道我有什么选择或者我可以做些什么来阻止查询将这么多的信息写入事务日志?
【问题讨论】:
-
一件事可能是通过在 cid 上使用 WHERE 子句将更新查询分成更小的块。即,如果您有 2000 万行,请尝试限制为
WHERE cid < 100000。然后运行WHERE cid BETWEEN 100000 AND 200000等 -
...也许还有检查点/备份之间的日志。更多信息:sqlperformance.com/2013/03/io-subsystem/chunk-deletes
-
更多关于TransactionLog的线索dba.stackexchange.com/questions/43796/…
标签: sql-server sql-server-2012 transaction-log