- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个存储过程,它将从某个查询中产生的数百万行批量插入到 SQL 数据库中。它有一个参数选择批处理;当省略此参数时,它将收集批处理列表并递归调用自身,以便迭代批处理。在(伪)代码中,它看起来像这样:
CREATE PROCEDURE spProcedure AS BEGIN
IF @code = 0 BEGIN
...
WHILE @@Fetch_Status=0 BEGIN
EXEC spProcedure @code
FETCH NEXT ... INTO @code
END
END
ELSE BEGIN
-- Disable indexes
...
INSERT INTO table
SELECT (...)
-- Enable indexes
...
现在,这个过程可能会很慢,无论出于什么原因:它无法获得锁,它使用的索引之一被错误定义或禁用。在这种情况下,我希望能够终止该过程,截断并重新创建结果表,然后重试。但是,当我尝试终止该过程时,该过程经常会进入 KILLED/ROLLBACK 状态,并且似乎无法返回。从谷歌我学会了做sp_lock
,找到spid,然后用KILL <spid>
杀死它。但当我试图杀死它时,它告诉我
SPID 75: transaction rollback in progress. Estimated rollback completion: 0%. Estimated time remaining: 554 seconds.
我确实找到了forum message暗示另一个 spid 应该在另一个 spid 开始回滚之前被杀死。但这对我来说也不起作用,而且我不明白,为什么会出现这种情况......可能是因为我递归地调用我自己的存储过程吗? (但它应该具有相同的 spid,对吧?)
无论如何,我的进程只是坐在那里,死了,不响应终止,并锁定表。这是非常令人沮丧的,因为我想继续开发我的查询,而不是在我的服务器上等待数小时,同时假装正在完成所谓的回滚。
是否有某种方法可以告诉服务器不要为我的查询存储任何回滚信息?或者不允许任何其他查询干扰回滚,这样就不会花费这么长时间?或者如何以更好的方式重写我的查询,或者如何在不重新启动服务器的情况下成功终止进程?
最佳答案
一些评论。
首先,gbn 关于无法取消正在进行的回滚的说法是正确的。这就是 SQL 保持事务完整性的方式,您不希望这种行为发生改变。如果您完全不在乎,只想将数据库恢复到上次备份时的位置,请按照他的步骤操作。
但是,有一点需要注意。有时我看到 spid 并没有真正回滚,它只是卡住了(通常处于 0% 或 100% 进度)。在这种情况下,最可靠的指标是事件监视器中 spid 的 CPU/IO 计数器是否没有变化(并且 SPID 没有被另一个 SPID 阻止)。在这种情况下,您可能需要重新启动 SQL 服务(不需要完全重新启动)才能清除 spid。
关于重新组织查询以使这些回滚不会削弱您的能力,是的,这是可能的。只需使用显式事务即可:
WHILE @@Fetch_Status=0 BEGIN
BEGIN TRANS
EXEC spProcedure @code
COMMIT TRANS
FETCH NEXT ... INTO @code
END
数据在每个批处理后提交。如果您遇到问题并且必须终止 spid,它应该只回滚它正在处理的当前批处理。
如果单个批处理太多,您可能可以重构“spProcedure”以插入 10k-100k 记录的较小批处理,并在每个批处理后提交。
关于sql-server - 如何从 KILLED/ROLLBACK 状态挽救 SQL Server 2008 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2820576/
我有三张 table 。表 A 有选项名称(即颜色、尺寸)。表 B 有选项值名称(即蓝色、红色、黑色等)。表C通过将选项名称id和选项名称值id放在一起来建立关系。 我的查询需要显示值和选项的名称,而
在mysql中,如何计算一行中的非空单元格?我只想计算某些列之间的单元格,比如第 3-10 列之间的单元格。不是所有的列...同样,仅在该行中。 最佳答案 如果你想这样做,只能在 sql 中使用名称而
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 7 年前。 Improve this ques
我正在为版本7.6进行Elasticsearch查询 我的查询是这样的: { "query": { "bool": { "should": [ {
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 7 年前。 Improve this ques
是否可以编写一个查询来检查任一子查询(而不是一个子查询)是否正确? SELECT * FROM employees e WHERE NOT EXISTS (
我找到了很多关于我的问题的答案,但问题没有解决 我有表格,有数据,例如: Data 1 Data 2 Data 3
以下查询返回错误: 查询: SELECT Id, FirstName, LastName, OwnerId, PersonEmail FROM Account WHERE lower(PersonEm
以下查询返回错误: 查询: SELECT Id, FirstName, LastName, OwnerId, PersonEmail FROM Account WHERE lower(PersonEm
我从 EditText 中获取了 String 值。以及提交查询的按钮。 String sql=editQuery.getText().toString();// SELECT * FROM empl
我有一个或多或少有效的查询(关于结果),但处理大约需要 45 秒。这对于在 GUI 中呈现数据来说肯定太长了。 所以我的需求是找到一个更快/更高效的查询(几毫秒左右会很好)我的数据表大约有 3000
这是我第一次使用 Stack Overflow,所以我希望我以正确的方式提出这个问题。 我有 2 个 SQL 查询,我正在尝试比较和识别缺失值,尽管我无法将 NULL 字段添加到第二个查询中以识别缺失
什么是动态 SQL 查询?何时需要使用动态 SQL 查询?我使用的是 SQL Server 2005。 最佳答案 这里有几篇文章: Introduction to Dynamic SQL Dynami
include "mysql.php"; $query= "SELECT ID,name,displayname,established,summary,searchlink,im
我有一个查询要“转换”为 mysql。这是查询: select top 5 * from (select id, firstName, lastName, sum(fileSize) as To
通过我的研究,我发现至少从 EF 4.1 开始,EF 查询上的 .ToString() 方法将返回要运行的 SQL。事实上,这对我来说非常有用,使用 Entity Framework 5 和 6。 但
我在构造查询来执行以下操作时遇到问题: 按activity_type_id过滤联系人,仅显示最近事件具有所需activity_type_id或为NULL(无事件)的联系人 表格结构如下: 一个联系人可
如何让我输入数据库的信息在输入数据 5 分钟后自行更新? 假设我有一张 table : +--+--+-----+ |id|ip|count| +--+--+-----+ |
我正在尝试搜索正好是 4 位数字的 ID,我知道我需要使用 LENGTH() 字符串函数,但找不到如何使用它的示例。我正在尝试以下(和其他变体)但它们不起作用。 SELECT max(car_id)
我有一个在 mysql 上运行良好的 sql 查询(查询 + 连接): select sum(pa.price) from user u , purchase pu , pack pa where (
我是一名优秀的程序员,十分优秀!