sql server中如何快速批量删除表里的百万条记录!直接用delete top(50000)还是有点慢...

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql server中如何快速批量删除表里的百万条记录!直接用delete top(50000)还是有点慢...相关的知识,希望对你有一定的参考价值。

删除大量数据速度是正常的。
如果表里面数据都不要了,可以直接truncate
如果表里面数据只有一小部分要得,可以把小的备份出来,然后truncate表,然后再把备份的数据导回来
如果只是删除表中部分数据,可以写成循环小批量删除脚本;如果服务器性能好,百万数据删除还是很快的
参考技术A 看需要删除的记录占该表的比例,如果全部不要则直接truncate;如果小部分要保留则可以复制需要保留的到新表,然后truncate,再将新表的数据复制回原表;如果需要删除的记录只是表中的一小部分,则可以通过脚本循环精准定位删除。当然如果一个表非常大,建议建立分区表方便大量的记录删除等操作。 参考技术B 如果是该表的数据全部删除的话可以按szm341说的直接用truncate table 清空表,如果只是部分删除,而且保留的数据比较少的话可以先将保留的数据导出或存到一个临时表中,然後用truncate table 清空表,再将需要的数据导入即可。 参考技术C 如果是清空表的话可以用truncate table tbname
如果删除指定数据的话还是用循环delete top吧
参考技术D drop table
然后在重建不就可以了

ThinkPHP导出百万条数据量

项目中,需要将数据库中的百万条数据导出,用PHPExcel的话,PHP内存会各种溢出什么的,所以就用的CSV批量导出再打包下载,随后删除生成的数据。 
技术图片 
技术图片

 

public function excelout()
{
    $array = array(‘ulId‘, ‘aucSUPI‘, ‘ucRatRest‘, ‘ausForbidden‘, ‘ausForbidde‘, ‘ausAllowedArea_1‘,
‘ausAllowedArea_2‘, ‘ausNonAl‘, ‘ausNonAllow‘, ‘ausAllowN‘, ‘ausAllow‘, ‘ucMicoMode‘,‘aucDnn_1‘, ‘aucDnn_2‘, ‘aucDnn_3‘, ‘aucLand‘,‘ulTa1‘,‘ulTa2‘
        );
    $this->putCsv($array);
}
function putCsv($head, $mark = ‘attack_ip_info‘, $fileName = "test.csv")
{
    set_time_limit(0);
    $sqlCount = Db::table(‘ue_subscriber‘)->count();
    //输出Excel文件头,可把user.csv换成你要的文件名
    header(‘Content-Type: application/vnd.ms-excel;charset=utf-8‘);
    header(‘Content-Disposition: attachment;filename="‘ . $fileName . ‘"‘);
    header(‘Cache-Control: max-age=0‘);

    $sqlLimit = 100000;//每次只从数据库取100000条以防变量缓存太大
    //每隔$limit行,刷新一下输出buffer,不要太大,也不要太小
    $limit = 100000;
    //buffer计数器
    $cnt = 0;
    $fileNameArr = array();
    //逐行取出数据,不浪费内存
    for ($i = 0; $i < ceil($sqlCount / $sqlLimit); $i++) {
      $fp = fopen($mark . ‘_‘ . $i . ‘.csv‘, ‘w‘); //生成临时文件
      //chmod(‘attack_ip_info_‘ . $i . ‘.csv‘,777);//修改可执行权限
      $fileNameArr[] = $mark . ‘_‘ .  $i . ‘.csv‘;
      //将数据通过fputcsv写到文件句柄
      fputcsv($fp, $head);
      $dataArr = Db::table(‘ue_subscriber‘)->limit($i * $sqlLimit,$sqlLimit)->select();
      foreach ($dataArr as $a) {
          $cnt++;
          if ($limit == $cnt) {
              //刷新一下输出buffer,防止由于数据过多造成问题
              ob_flush();
              flush();
              $cnt = 0;
          }
          fputcsv($fp, $a);
      }
          fclose($fp);//每生成一个文件关闭
   }
   //进行多个文件压缩
   $zip = new ZipArchive();
   $filename = $mark . ".zip";
   $zip->open($filename, ZipArchive::CREATE);//打开压缩包
   foreach ($fileNameArr as $file) {
       $zip->addFile($file, basename($file));//向压缩包中添加文件
   }
   $zip->close();//关闭压缩包
   foreach ($fileNameArr as $file) {
       unlink($file);//删除csv临时文件
   }
   //输出压缩文件提供下载
   header("Cache-Control: max-age=0");
   header("Content-Description: File Transfer");
   header(‘Content-disposition: attachment; filename=‘ . basename($filename));
   header("Content-Type: application/zip");
   header("Content-Transfer-Encoding: binary");
   header(‘Content-Length: ‘ . filesize($filename));
   @readfile($filename);//输出文件;
   unlink($filename); //删除压缩包临时文件
}

 原文地址:https://blog.csdn.net/lzj_dandan/article/details/78490687

以上是关于sql server中如何快速批量删除表里的百万条记录!直接用delete top(50000)还是有点慢...的主要内容,如果未能解决你的问题,请参考以下文章

如何向一个oracle表中快速插入很多条数据

sql server 2008r2 向带有索引的表里大批量插入数据

关于SQL SERVER的修改数据问题.难得我哦

ThinkPHP导出百万条数据量

用啥方法能快速向mysql表里批量添加数据?

如何通过 MS ACCESS 表执行 SQL Server 表的批量更新