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 意味尽量减少日志,可以加速索引重建

  • ONLINENOLOGGING 两者位置顺序可以对调,不影响

  • 普通情况下建立索引或者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_TABLESALL_TABLESDBA_TABLES
  • FOR ALL INDEXES的统计信息存在于视图: USER_INDEXESALL_INDEXESDBA_INDEXES
  • FOR ALL COLUMNS的统计信息存在于试图:USER_TAB_COLUMNSALL_TAB_COLUMNSDBA_TAB_COLUMNS

Oracle 删除大量表记录操作总结的更多相关文章

  1. --oracle删除数据库表(无主键)中重复的记录

    --oracle删除数据库表(无主键)中重复的记录 1,  CREATE TABLE newtable as SELECT distinct * FROM T_SYSTEM_MENU_PRIV; 2, ...

  2. MySQL数据库(3)_MySQL数据库表记录操作语句

    附: MYSQL5.7版本sql_mode=only_full_group_by问题 .查询当前sql_mode: select @@sql_mode .查询出来的值为: set @@sql_mode ...

  3. mysql支持跨表delete删除多表记录

    前几天写了Mysql跨表更新的一篇总结,今天我们看下跨表删除. 在Mysql4.0之后,mysql开始支持跨表delete. Mysql可以在一个sql语句中同时删除多表记录,也可以根据多个表之间的关 ...

  4. 巧用*_his表记录操作历史

    文章转载自「开发者圆桌」一个关于开发者入门.进阶.踩坑的微信公众号 许多OLTP应用的开发者都知道,一些重要的操作要记录操作历史,把操作前的数据备份到历史表,然后再执行相应的修改操作.这样可以获取某个 ...

  5. oracle用户与表空间操作

    oracle系统用户sys,system , sysman, scott 使用system用户登录[username/password][@server][as sysdba|sysoper]eg: ...

  6. 卸载oracle删除注册表脚本

    一.前言 在我们操作系统中,有时要卸载oracle数据库,每一次都要去删除win下的注册表,为了方便删除注册表的信息,下面通过一种删除注册表快捷的脚本. 二.脚本信息 Windows Registry ...

  7. oracle删除users表空间

    1.users表空间一般情况下是默认的,需将别的空间设置成默认,再删除users表空间(oracle不允许删除默认空间的). 2.删除表空间的同时会报这样的错:ORA-22868错误.原因:推断应该存 ...

  8. 在EntityFramework(EF)中删除主从表记录

    删除主表:  如果要删除单个的Book对象,由于启用了级联删除,干掉一个Book,它所关联的所有BookReview也一并删除了. (说的简单,如果用Attach方法或者Remove,加修改删除状态, ...

  9. oracle多表关联删除数据表记录方法

    oracle多表关联删除的两种方法 第一种使用exists方法 delete from tableA where exits ( select 1 from tableB Where tableA.i ...

  10. Oracle删除重复数据记录

    删除重复记录,利用ROWID 和MIN(或MAX)函数, ROWID在整个数据库中是唯一的,由Oracle自己产生和维护,并唯一标识一行(无论该表中是否有主键和唯一性约束),ROWID确定了每条记录在 ...

随机推荐

  1. SSH-Web 工具之 shellinabox:一款使用 AJAX 的基于 Web 的终端模拟器 安装及使用教程

    本文转载自: shellinabox:一款使用 AJAX 的基于 Web 的终端模拟器 一.shellinabox简介 通常情况下,我们在访问任何远程服务器时,会使用常见的通信工具如OpenSSH和P ...

  2. 理解Vue 3响应式系统原理

    title: 理解Vue 3响应式系统原理 date: 2024/5/28 15:44:47 updated: 2024/5/28 15:44:47 categories: 前端开发 tags: Vu ...

  3. windows下IPv4通信(C++、MFC)

    Cilect #include <stdio.h> #include <Ws2tcpip.h> #include <winsock2.h> #define HELL ...

  4. 抖音App动态调试

    一.准备工作 1)接上一篇,下载砸过壳的抖音IPA 2)MonkeyDev环境 3)class_dump 二.使用MonkeyDev建立空的工程,拖入IPA到目标文件夹中 1)启动Xcode进行编译执 ...

  5. NOIP模拟56

    前言 话说, T2 和 T3 的题面好像放反了. T1 爆零 解题思路 是个原题.. 当时 WindZR 25分钟就码完了,然后我就慌死,写完就开始调,诶,我当时场上不是切了吗,怎么现在打不对了.. ...

  6. 阿里云入选Gartner「边缘分发平台市场指南」代表厂商

    近日,全球技术研究与咨询机构Gartner首次发布边缘分发平台市场指南报告<Market Guide for Edge Distribution Platforms>,阿里云凭借内容分发网 ...

  7. C#.NET 读取PFX私钥证书并导出PEM格式私钥

    项目nuget引用 BouncyCastle. 读取证书 X509Certificate2 x509 = new X509Certificate2(lblPfxPath.Text, txtPfxPwd ...

  8. 双等号==与equals的区别与联系

    ==与equals的区别与联系: 1)对于双等号==来说,比较的是值是否相等 如果双等号比较的是基本数据类型的变量,则直接比较变量的值是否相等, 如果双等号比较的是引用类型的变量,则比较的是所指向对象 ...

  9. sql的删除语句

    好久没用过sql的删除语句了,今天写删除语句的时候报错了,应该是:   DELETE FROM 表名称 WHERE 列名称 = 值 我写成了: DELETE FROM 表名称 别名 WHERE 别名. ...

  10. element el-input 去掉边框

    element样式还是蛮好的,只是有时候我们需要做一些调整,比如,el-input 的边框,官网是这样子的 我们需要去掉这个边框 试了常用的:border: none:  以及:outline:non ...