楼主: szxiaocong

抛砖引玉, 8000w左右的总数据量,删除1500w 左右的记录

[复制链接]
招聘 : 数据库管理员
论坛徽章:
99
技术图书徽章
日期:2014-03-27 09:30:56秀才
日期:2018-04-08 14:48:31
11#
 楼主| 发表于 2018-2-6 16:54 | 只看该作者

----------------test1,guid----------------
select guid_row into #A2
from  test_delete2 with(nolock) ----1000w,guid_row ,pk and clustered index
where rowid%100 = 0
--1075

create clustered index inx2 on #A2(guid_row)

select top 100 * into #T2 from #A2


set statistics io on

delete s
from test_delete2 s
inner join #T2 t on s.guid_row = t.guid_row

Table 'test_delete2'. Scan count 100, logical reads 1262, physical reads 3, read-ahead reads 64, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table '#T2_________________________________________________________________________________________________________________00000000002A'. Scan count 1, logical reads 2, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

(100 row(s) affected)

---------------------test2 int -----------------------------------------------

select rowid into #A1
from  test_delete1 with(nolock)  ----1000w, rowid int ,pk and clustered index
where rowid%100 = 0
--1075


---create index on A1

create clustered index inx2 on #A1(rowid)

------------------

select top 100 * into #T1 from #A1

--------------

set statistics io on

delete s
from test_delete1 s
inner join #T1 t on s.rowid = t.rowid

Table 'test_delete1'. Scan count 100, logical reads 869, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table '#T1_________________________________________________________________________________________________________________000000000029'. Scan count 1, logical reads 2, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

(100 row(s) affected)

使用道具 举报

回复
招聘 : 数据库管理员
论坛徽章:
99
技术图书徽章
日期:2014-03-27 09:30:56秀才
日期:2018-04-08 14:48:31
12#
 楼主| 发表于 2018-2-6 16:54 | 只看该作者
大家 可以看看 上面的 case test

使用道具 举报

回复
招聘 : 数据库管理员
论坛徽章:
99
技术图书徽章
日期:2014-03-27 09:30:56秀才
日期:2018-04-08 14:48:31
13#
 楼主| 发表于 2018-2-7 13:45 | 只看该作者
lixunpeng 发表于 2018-2-6 16:40
要是设计成分区表,就可以删分区了。当前的表也可以改造成分区表。

这里先暂不考虑分区啊什么的,
就是数据删除操作

使用道具 举报

回复
论坛徽章:
40
2014年新春福章
日期:2014-02-18 16:42:02秀才
日期:2015-12-18 09:28:57秀才
日期:2015-12-14 14:51:162015年中国系统架构师大会纪念徽章
日期:2015-09-16 12:54:392014系统架构师大会纪念章
日期:2015-09-16 12:54:392013系统架构师大会纪念章
日期:2015-09-16 12:54:392012系统架构师大会纪念章
日期:2015-09-16 12:54:392011系统架构师大会纪念章
日期:2015-09-16 12:54:392010系统架构师大会纪念
日期:2015-09-16 12:54:39秀才
日期:2015-12-25 15:31:10
14#
发表于 2018-2-8 14:31 | 只看该作者
能分区删除就分区删除,如果这样不能满足,先放着,又不多。等到一定程度满足分区删除了再卸载分区。一定要有分区。不到一个亿,还是小表。

使用道具 举报

回复
论坛徽章:
8
2009新春纪念徽章
日期:2009-01-04 14:52:28祖国60周年纪念徽章
日期:2009-10-09 08:28:002010新春纪念徽章
日期:2010-03-01 11:07:24ITPUB9周年纪念徽章
日期:2010-10-08 09:32:25ITPUB十周年纪念徽章
日期:2011-11-01 16:23:262013年新春福章
日期:2013-02-25 14:51:24沸羊羊
日期:2015-03-04 14:51:522015年新春福章
日期:2015-03-06 11:57:31
15#
发表于 2018-2-8 15:05 来自手机 | 只看该作者
没多少数据,也没必要考虑那么复杂,有分区最好,没分区,只能通过索引多次小批量删除,因为要考虑锁资源这块。

使用道具 举报

回复
论坛徽章:
0
16#
发表于 2018-2-25 09:54 | 只看该作者
方式一:直接以nologging的方式建一张表,最后再重命名或者重定义表
1) create table TMP_TABLE1 nologging partition by range ... as select /*+ parallel(t,8) */ * from ... where...;
2) create index IDX_1 on TMP_TABLE1 (COL) parallel 8 local nologging;
3)重命名表或者用DBMS_REDEFINITION重定义表
参考https://asktom.oracle.com/pls/ap ... billions-of-records

方式二:跟1楼的方式一样采用批量循环删除的方式,不过采用BULK COLLECT INTO来做批量绑定,减少PL/SQL引擎和SQL引擎之间的上下文切换次数,提高删除效率。BULK COLLECT一次取出一个数据集合,比用游标取数据效率高,特别是在网络情况不太好的情况下,缺点是BULK COLLECT需要内存更多。
CREATE OR REPLACE PROCEDURE P_BULK_DELETE
AS
CURSOR cur IS
    SELECT rowid FROM table_1 where b>=sysdate-80;  --要删除的SQL结果
    row_id_table dbms_sql.urowid_table;
BEGIN
  OPEN cur;
  WHILE (TRUE) LOOP
    FETCH cur BULK COLLECT
      INTO row_id_table LIMIT 10000;  --如每10000条提交一次
    FORALL i IN 1 .. row_id_table.COUNT
      execute immediate 'delete from table_1 where rowid = :1' using row_id_table(i);
    COMMIT;
    EXIT WHEN cur%NOTFOUND;
  END LOOP;
  CLOSE cur;
END;
/

考虑到碎片,删除后再做一次SHRINK SPACE [CASCADE]数据块。

方式三:在方式一的基础上,用DBMS_REDEFINITION包在线重定义分区表

使用道具 举报

回复
招聘 : 数据库管理员
论坛徽章:
99
技术图书徽章
日期:2014-03-27 09:30:56秀才
日期:2018-04-08 14:48:31
17#
 楼主| 发表于 2018-2-25 10:16 | 只看该作者
hzhv 发表于 2018-2-25 09:54
方式一:直接以nologging的方式建一张表,最后再重命名或者重定义表
1) create table TMP_TABLE1 nologgin ...

写的 很好 ,经验贴

使用道具 举报

回复
论坛徽章:
0
18#
发表于 2018-2-26 17:34 | 只看该作者
很不错

使用道具 举报

回复
招聘 : 数据库管理员
论坛徽章:
99
技术图书徽章
日期:2014-03-27 09:30:56秀才
日期:2018-04-08 14:48:31
19#
 楼主| 发表于 2018-3-1 15:41 | 只看该作者
luckyrandom 发表于 2018-2-2 13:19
若有维护窗口,就直接删呗。。若ONLINE,条件不是PK or 唯一键,建议先查询出要删除的PK or 唯一键,再小批 ...

现在还可以揽到私活不啊

使用道具 举报

回复
论坛徽章:
0
20#
发表于 2018-4-3 23:52 | 只看该作者
直接删除吧,1500W数据量不是很大。如果是上亿的数据量建议创建临时表备份数据在回插,效率会高很多。

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表