我正在使用SQL Server,我有一个非常大的表。
如果我们使用delete from table
查询,我们就会跳转到事务日志中。
我应该使用像这样的查询
delete top (@count) from table
然后我应该在我的asp.net代码中加入一段时间。
我的问题是实现这些目标的最佳@count
金额是多少:
添加信息: 这是一个item_in_tags表,它存储了项目ID和标签ID,因此当我想重新标记我需要删除其中的所有项目然后将数据输入到表中时,它有很多行,因为我不能拥有非常大的事务,因为事务日志中的跳转对于主机是不可接受的,并且我没有收缩权限。 我希望保持交易规模小而快,但我也希望获得最佳性能,并且在重复过程中我不想为表锁定等问题争分夺秒。
答案 0 :(得分:7)
评论太长了。
您的问题没有足够的信息来回答问题。即使它确实如此,也没有正确的答案,例如42就是对生命意义的回答。
以下是不同的情景,似乎属于您所要求的范围:
您想要删除表格中的所有内容。然后truncate table
是正确的做法。
您的删除查询需要执行全表扫描以识别要删除的行。然后,更大的数字可能会更好,以减少全表扫描的数量。
您在表上有非常复杂的触发器或级联操作。在那种情况下," 1"可能是最好的答案。
其他查询正在修改表,因此您可能会遇到锁定冲突和超时的问题。在这种情况下,您可能需要等到系统更安静才能完成您的工作。
其他操作是只读的,不需要查看删除操作。在这种情况下,选择另一个表,并在表未使用时使用sp_rename
可能是最有效的解决方案。
而且,毫无疑问其他情况也是如此。我的建议是选择100或1000之类的数字,然后选择它。如果删除似乎干扰了其他操作,请减少该数量。
答案 1 :(得分:1)
对于许多操作,Microsoft过去默认为1000行,现在它在SSIS中默认为一次10000行。许多开发人员使用10000作为大型事务的行数,但您可能希望使用该数字来查看(在您的系统上有自己的内存和硬盘),以查看更大或更小的数字是否更快完成。 / p>
答案 2 :(得分:1)
或者,您可以通过将要保留的记录插入临时表中然后截断实际表来尝试此方法。然后,将这些临时表记录传回到您的实际表中。不确定你会从中获得多少收益,但绝对会建议在执行此操作之前执行BACKUP
:
SELECT item_id,
tag_id
INTO #Holdingtable
FROM item_in_tags
WHERE items_id IN (***items you want to keep****)
TRUNCATE TABLE item_in_tags
INSERT into item_in_tags
SELECT
item_id,
tag_id
FROM #Holdingtable
答案 3 :(得分:1)
我不确定我是否完全理解这个问题,但这是我收集的两分钱。你想快速删除记录吗?如果您不想记录数据,截断表将是最佳选择。如果您希望从该表中保留一些记录,我会先将这些记录插入临时表中,然后在截断表后将它们插回到实际表中。
希望我帮助,如果我误解了你,我道歉。
答案 4 :(得分:0)
用户Truncate Table myTable
如果您在该表上没有需要触发的触发器。可以把它想象成基本上在表格的顶部打一个END-OF-FILE标记。