我有一张 20亿行的表格。 恢复模式很简单。
我有一个简单的任务要做:
class Foo
{
public:
void SetMember(int n) { AcquireMutex(..); n_ = n; ReleaseMutex(...);}
private:
Thread()
{
while(1)
{
AcquireMutex(..);
// Do something with n_
ReleaseMutex(...);
}
}
};
这个任务起初看起来很简单,但在我读到的任何地方,最好将SELECT INTO放到另一个表中,或者进行批量更新。
批量更新是否必要?上面的查询是否会破坏事务日志?
如果我创建另一张桌子,我肯定会用完空间。
任何帮助将不胜感激。
编辑:我没有主键。此外,没有索引,没有约束,任何东西。
也许这会有所帮助?
Commit failed with error:
pathspec 'f/Workspaces/AndroidStudio/ProjectName/app/src/main/java/com/ project/Utilities/PixelConverter.java' did not match any file(s) known to git.
答案 0 :(得分:1)
这是一种非常狂野的non-sql
方式,但您可以使用ETL
工具(例如SSIS
)来避免在很大程度上进行日志记录。
免责声明:这可能是一个耗时的步骤,可能会占用您服务器上的文件空间。
有两个数据流任务(DFT1,DFT2)。
<强> DFT1 强>
使用派生列转换,传递值“A”而不是实际值columnA
。
平面文件现在将具有必需的数据。下一步是将其导入表格。
在DFT 之外,现在截断此表。您可能知道TRUNCATE
是未记录的操作。因此,不会触及您的交易日志。
最后,
<强> DFT2 强>
从平面文件将数据导入tableA。
SSIS
内部执行最小的日志记录,因此trasaction日志不会受到太多打扰。
另外,我刚看到你在你的问题中添加了ssis标签,所以这个答案应该是有效的。
答案 1 :(得分:0)
分批运行
Declare @pk integer = 0
declare @max integer
select @max = Max(primKeyCol) from myTable
While @pk < @Max Begin
Update myTable set columnA = 'X'
Where primKeyCol Between @pk and @pk + 999
Set @pk += 1000
End
答案 2 :(得分:0)
我建议您使用批量更新,因为大表中的这种UPDATE会导致大量锁定。 我找到了批次here
的一个很好的例子答案 3 :(得分:0)
尝试一次更新50.000行
DECLARE @chk INT = 1
WHILE @chk > 0
BEGIN
;WITH CTE as
(
SELECT TOP 50000 columnA
FROM myTable
-- the reason for this check is to check for NULLS in columnA
-- otherwise it could just be columnA <> 'X'
WHERE exists(SELECT columnA EXCEPT SELECT 'X')
)
UPDATE CTE SET columnA = 'X'
SET @chk = @@rowcount
WAITFOR DELAY '00:00:30' -- 30 seconds, may need to change it
END
来自microsoft Link
使用SET ROWCOUNT不会影响DELETE,INSERT和UPDATE SQL Server未来版本中的语句。避免使用SET ROWCOUNT 在新的开发工作中使用DELETE,INSERT和UPDATE语句, 并计划修改当前使用它的应用程序。对于类似的 行为,使用TOP语法。有关更多信息,请参阅TOP (处理SQL)。