Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 增量删除-它有什么好处?_Sql Server_Performance_Sql Delete - Fatal编程技术网

Sql server 增量删除-它有什么好处?

Sql server 增量删除-它有什么好处?,sql-server,performance,sql-delete,Sql Server,Performance,Sql Delete,如果我有一个包含大量数据的表…如果我做增量删除而不是“一次性删除”。有什么好处 一次性删除 增量删除 我得到了他的帮助 取决于配置,我看到过大量删除会破坏事务日志,导致磁盘空间不足 您还可以通过使用较小的批来避免锁定升级 或者,您可以导出要保留的数据,截断表,然后重新加载数据。这可能更快。即使您希望kepp 50%的数据,它仍然可以更快-truncate只记录很少的数据。运行自己的基准测试不同之处在于回滚信息的大小 SQL Server是事务性的,在提交删除之前,应该可以回滚事务 以以下为例:

如果我有一个包含大量数据的表…如果我做增量删除而不是“一次性删除”。有什么好处

一次性删除 增量删除 我得到了他的帮助

取决于配置,我看到过大量删除会破坏事务日志,导致磁盘空间不足


您还可以通过使用较小的批来避免锁定升级

或者,您可以导出要保留的数据,截断表,然后重新加载数据。这可能更快。即使您希望kepp 50%的数据,它仍然可以更快-truncate只记录很少的数据。运行自己的基准测试

不同之处在于回滚信息的大小

SQL Server是事务性的,在提交删除之前,应该可以回滚事务

以以下为例:

  • 硬盘上的可用空间为10 GB
  • 要删除的信息20 GB
启动删除时,事务日志将增长,直到磁盘已满,然后它将崩溃

即使有足够的磁盘空间,也存在其他问题,如数据库锁定或性能问题。如果从实时系统中删除数据,这可能是一个严重的问题

我是DB调优方面的新手(

我也是…

但我不需要理解复杂的技术(如锁升级等)感受/猜测用小块吃/咬西瓜的好处,而不是把整片西瓜放进我的嘴里

只需补充一点,一旦持有5000个锁,就会尝试锁升级,因此即使在增量版本中,批量大小也需要减少很多才能获得此好处。减少批量大小->你是说changing从“100000”到“100”的值。在下面的查询中?删除顶部(100000)从表_1中,其中BID=@BID和CN=@CN和PD=@PD;@Anish-5000假设删除操作采用行锁。但是,如果您不必担心并发访问,这并不重要。@Anish,当SQL server优化器通过将锁定表而不是行的条件时,锁升级就发生了。@Anishe许多级别的升级,但这是一般的想法。我需要保留的数据比我希望删除的数据多。因此我认为这种方法不好……不是吗?它仍然可以更快-truncate只记录了最少的日志。运行您自己的基准测试。要知道:如果表被调用,则不可能截断表在复制或日志传送中,如果外键引用了要截断的表。一次事务中的4亿条记录将炸毁您的日志,如果要这样做,请确保您有足够的空间。我不会一次删除400 mn…我有一个包含400 mn数据的表…我将一次从中删除150万数据…一个d向其中插入一些数据。好的……这意味着……增量删除将明显减少(删除数据)的时间@Anish,更重要的是,它更有可能工作,我们最近不得不从一个实时数据库中删除15000000行,我们一次删除500000行。一次删除所有行将导致系统崩溃。我在看…为什么/如何受益…我从一些人那里得到了答案,这是因为sql server保留的日志…以及在吃西瓜的时候,我没有记录西瓜的习惯,因为我从不把西瓜倒回去。
 DELETE table_1
     WHERE BID = @BID
    AND CN = @CN        
     AND PD = @PD;  
While (1=1)
Begin
 DELETE TOP (100000) FROM table_1
     WHERE BID = @BID
    AND CN = @CN        
     AND PD = @PD;  

If @@rowcount = 0   -- No row affected.
  BREAK
 ELSE
  Continue
End