Oracle 删除大量表记录操作总结
By:授客 QQ:1033553122
删除表数据操作
清空所有表记录
TRUNCATE TABLE your_table_name;
或者批量删除满足条件的表记录
BEGIN
LOOP
DELETE FROM your_table_name WHERE rownum <= 50000;
EXIT WHEN SQL%ROWCOUNT = 0;
COMMIT;
END LOOP;
END;
释放表空间
存放大数据量的表,其表空间占用也比较大,删除数据后并不会自动释放这些记录占用的表空间,所以,即便表里面数据量很少,查询效率依旧很慢,所以,需要释放表空间。
-- 查询数据表占用的表空间大小
SELECT sum(bytes)/(1024*1024) FROM user_segments WHERE segment_name='YOUR_TABLE_NAME'; --注意,表名必须大写
说明:sum(bytes)/(1024*1024) 数据统计单位由Byte转为GB
--整理碎片,释放已删除记录占用的表空间
ALTER TABLE your_table_name MOVE;
重建索引
释放了表空间以后表的ROWID会发生变化,基于ROWID的索引会失效,此时就需要重建索引
--重建非分区索引
ALTER TABLE your_table_index REBUILD [ONLINE] [NOLOGGING];
--重建分区索引
--针对分区索引-非组合索引
ALTER INDEX your_table_index REBUILD PARTITION your_partition_name [ONLINE] [NOLOGGING];
注意:
设置日志级别为
NOLOGGING意味尽量减少日志,可以加速索引重建ONLINE,NOLOGGING两者位置顺序可以对调,不影响普通情况下建立索引或者REBUILD索引时,oracle会对基表加共享锁,在这期间,无法对表进行DML操作。如果希望避免这种情况,需要加
ONLINE选项对索引进行REBUILD时,如果不加
ONLINE选项,则Oracle直接读取原索引的数据,否则直接扫描表中的数据 ,索引在重建时,查询仍然可以使用旧索引。实际上,Oracle在REBUILD索引的过程中,并不会删除旧索引,直到新索引重建成功,这就是相对删除索引然后重建索引的一个好处:不会影响原有的SQL查询。但也正由于此,用REBUILD方式建立索引需要相应表空间的空闲空间是删除重建方式的2倍。不能直接REBUILD整个分区索引
对于非组合索引,需要REBUILD每个分区(partition)
对于组合索引,需要REBUILD每个子分区(subpartition)
分区、子分区较多的情况下,可以使用下面的SQL可以生成相应的REBUILD语句
--重建分区索引-非组合索引
SELECT 'ALTER INDEX ' || index_owner || '.' ||index_name ||' REBUILD PARTITION ' || partition_name || ' NOLOGGING;'
FROM dba_ind_partitions
WHERE index_owner = 'INDEX_OWNER_NAME' --可选查询条件,注意,如果指定该条件,索引拥有者必须大写
AND index_name = 'YOUR_INDEX_NAME'; --注意,索引名称必须大写 --重建分区索引-组合索引
SELECT 'ALTER INDEX ' || index_owner || '.' ||index_name ||' REBUILD SUBPARTITION ' || subpartition_name || ' NOLOGGING;'
FROM dba_ind_subpartitions
WHERE index_owner = 'INDEX_OWNER_NAME' --可选查询条件,注意,如果指定该条件,索引拥有者必须大写
AND index_name = 'YOUR_INDEX_NAME'; --注意,索引名称必须大写
针对非分区索引,如果清理的表比较多,或者不知道被清理的表拥有哪些索引,可以使用以下SQL查询并生成对应的重建索引SQL
SELECT concat(concat('ALTER INDEX ', INDEX_NAME), ' REBUILD;')
FROM all_indexes
WHERE owner='INDEX_OWNER_NAME' --可选查询条件,注意,如果指定该条件,索引拥有者必须大写
AND table_name IN('TABLE_NAME1 ','TABLE_NAME2', '...', 'TABLE_NAMEN')--注意,表名必须大写
分析表
分析表,是为了使基于CBO的执行计划更加准确,在一定程度上能带来一些性能提升
ANALYZE TABLE table_name COMPUTE STATISTICS;
--等价于
ANALYZE TABLE table_name COMPUTE STATISTICS FOR TABLE FOR ALL INDEXES FOR ALL COLUMNS;
说明:生成的统计信息的存放位置:
FOR TABLE的统计信息存在于视图:USER_TABLES、ALL_TABLES、DBA_TABLESFOR ALL INDEXES的统计信息存在于视图:USER_INDEXES、ALL_INDEXES、DBA_INDEXESFOR ALL COLUMNS的统计信息存在于试图:USER_TAB_COLUMNS、ALL_TAB_COLUMNS、DBA_TAB_COLUMNS
Oracle 删除大量表记录操作总结的更多相关文章
- --oracle删除数据库表(无主键)中重复的记录
--oracle删除数据库表(无主键)中重复的记录 1, CREATE TABLE newtable as SELECT distinct * FROM T_SYSTEM_MENU_PRIV; 2, ...
- MySQL数据库(3)_MySQL数据库表记录操作语句
附: MYSQL5.7版本sql_mode=only_full_group_by问题 .查询当前sql_mode: select @@sql_mode .查询出来的值为: set @@sql_mode ...
- mysql支持跨表delete删除多表记录
前几天写了Mysql跨表更新的一篇总结,今天我们看下跨表删除. 在Mysql4.0之后,mysql开始支持跨表delete. Mysql可以在一个sql语句中同时删除多表记录,也可以根据多个表之间的关 ...
- 巧用*_his表记录操作历史
文章转载自「开发者圆桌」一个关于开发者入门.进阶.踩坑的微信公众号 许多OLTP应用的开发者都知道,一些重要的操作要记录操作历史,把操作前的数据备份到历史表,然后再执行相应的修改操作.这样可以获取某个 ...
- oracle用户与表空间操作
oracle系统用户sys,system , sysman, scott 使用system用户登录[username/password][@server][as sysdba|sysoper]eg: ...
- 卸载oracle删除注册表脚本
一.前言 在我们操作系统中,有时要卸载oracle数据库,每一次都要去删除win下的注册表,为了方便删除注册表的信息,下面通过一种删除注册表快捷的脚本. 二.脚本信息 Windows Registry ...
- oracle删除users表空间
1.users表空间一般情况下是默认的,需将别的空间设置成默认,再删除users表空间(oracle不允许删除默认空间的). 2.删除表空间的同时会报这样的错:ORA-22868错误.原因:推断应该存 ...
- 在EntityFramework(EF)中删除主从表记录
删除主表: 如果要删除单个的Book对象,由于启用了级联删除,干掉一个Book,它所关联的所有BookReview也一并删除了. (说的简单,如果用Attach方法或者Remove,加修改删除状态, ...
- oracle多表关联删除数据表记录方法
oracle多表关联删除的两种方法 第一种使用exists方法 delete from tableA where exits ( select 1 from tableB Where tableA.i ...
- Oracle删除重复数据记录
删除重复记录,利用ROWID 和MIN(或MAX)函数, ROWID在整个数据库中是唯一的,由Oracle自己产生和维护,并唯一标识一行(无论该表中是否有主键和唯一性约束),ROWID确定了每条记录在 ...
随机推荐
- c++ lambda学习举例
#include <iostream> #include<vector> #include<algorithm> #include<cmath> #in ...
- 到今天了你还不会集合的Stream操作吗?你要out了
Java8的两个重大改变,一个是Lambda表达式,另一个就是本节要讲的Stream API表达式.Stream 是Java8中处理集合的关键抽象概念,它可以对集合进行非常复杂的查找.过滤.筛选等操作 ...
- .NET桌面程序混合开发之一:Winform+H5,WebView2概览
1. 基于Microsoft Edge的WebView2介绍 Microsoft Edge WebView2控件可以将web技术(HTML,css,javascript)应用于原生程序中.WebVie ...
- LOTO示波器软件新增导览功能
新版本的大部分型号LOTO示波器的上位机软件我们改成了导航工具条方式.原来的方式是把所有功能都显示在不同的标签页中,这样的优点是非常快捷方便,基本上用鼠标一两次点击就能直达想要的功能设置.但是缺点是不 ...
- 关于ThreadLocal最直白的解释
ThreadLocal 底层原理如下: 实线是强引用,虚线是弱引用 Thread 持有 ThreadLocal 对象的引用,ThreadLocalMap 是 Thread 的成员变量,它是一个 Map ...
- 7.13晚考试总结(NOIP模拟14)[队长快跑·影魔·抛硬币]
樱花满地集于我心,楪舞纷飞祈愿相随 前言 终于没有令人头疼的数学了,总感觉这次考试的题目比较良心. 尤其是对于部分分的明细就非常到位(不像上一场的凭感觉给出部分分). 这就令我这种靠部分分暴力的菜鸡选 ...
- OpenCV笔记(7) 轮廓
1. 查找轮廓 FindContours public static void FindContours(InputOutputArray image, //输入8-bit单通道的图片 out Mat ...
- Vue渲染函数与JSX指南
title: Vue渲染函数与JSX指南 date: 2024/6/3 下午6:43:53 updated: 2024/6/3 下午6:43:53 categories: 前端开发 tags: Vue ...
- Android应用程序启动流程浅析-(三万字长文慎点&Android14)
在Android桌面Launcher源码浅析中介绍了Android的桌面程序Launcher是如何响应用户点击事件并启动App的,这篇文章继续介绍App在Android系统层是的启动流程. 一.启动流 ...
- DoNet Core的启动过程-WebApplicationBuilder
1.前言 在NET6开始做ASP.NETCore的开发,我们首先要看的是启动过程,而WebApplication和WebApplicationBuilder 类是启动过程好不开的类,WebApplic ...