Oracle 大表添加索引的最佳方式
背景:
业务系统中现在经常存在上亿数据的大表,在这样的大表上新建索引,是一个较为耗时的操作,特别是在生产环境的系统中,添加不当,有可能造成业务表锁表,业务表长时间的停服势必会影响正常业务的开展。根据个人的实际经验,我们可以使用三种手段来帮助大家解决这个问题,需要注意的是这三种方法并不是独立使用的,很多时候我们会结合起来一起使用来提升建索引的效率。
 
解决方案:
第一种方法就是使用并行——parallel 开启并发执行并发执行可以最大程度的利用我们的数据库的硬件资源,把大批量的数据分成小批量到不同的进程去执行,从而大大减少sql的执行的时间。由于建索引属于ddl操作,我们可以通过下面的语句来实现并发执行。 下面的语句中,我们就配置了使用并发值为8来执行我们的sql语句
 
CREATE INDEX idx_table1_column1 ON table1 (column1) PARALLEL 8;
 注意:并不是所有的系统都适用使用并行来解决,比如:目前有个系统使用cpu已经很高,如果这时你再开启并行,只会加重系统的负载。因此,在执行并行操作前一定要看一下系统目前使用情况。第二种方法是不开启日志——nologging我们知道数据表新增、修改、删除记录都可能会触发redo日志和undo日志的记录,特别是insert into table1 select * from table2这种语句,每条insert动作都会同时生成redo日志和undo日志,从而降低sql的执行速度。 对于创建索引的操作也是如此,索引的创建同样也涉及到这两类日志的记录,我们可以手动指定不记录非必要日志来加快sql执行的速度。
 
注意:nologging的核心在于只输入最少的redo日志(注意,这里不是不输出日志,只是最小化需要输入的日志量而已) 用法的话十分简单,只需要在我们创建索引的语句上加上nologging关键字即可
CREATE INDEX idx_table1_column1 ON table1 (column1) nologging;
第三种方法是在线执行——online(推荐使用)前面介绍的两个命令虽然能大幅度提升效率,但归根结底建索引就是会导致锁表,不停服执行的话还是相当有风险的,online的作用在于不阻塞DML操作,使得生产环境不会因为执行DDL语句导致业务功能阻塞, 尤其适合于不停机新建表索引这类场景。
 
需要注意的是,online关键字的使用相对来说耗时会长一些,而且online关键字只能用于新增索引,并不能用在修改表结构等SQL语句中。 online的使用也十分简单,在sql语句后面加上online就行。
CREATE INDEX idx_table1_column1 ON table1 (column1) online;
有了这三个方法,我们的最终的sql大概是这样的,有了online可以保障不影响业务主流程的进行,而nologging和parallel则可以大幅度提高我们sql的执行速度,个人觉得是一种可行的解决方案。
CREATE INDEX idx_table1_column1 ON table1 (column1) parallel 8 nologging online ;
很多朋友认为到这里就结束了,其实oracle数据库优化的空间永无止境,如果有朋友想追求最佳,想把数据库的性能发挥到最佳。那么下面还有三种方法,但是这些不常用,作为学习数据库的原理,可以了解一下。
===========================================
补充方法1:由于创建索引时需要对表进行全表扫描,可以适当考虑调大db_file_multiblock_read_count的值, db_file_multiblock_read_count影响Oracle在读取数据时一次读取的最大block数量,在进行一些数据量比较大的操作时,可以适当 调整当前session的db_file_multiblock_read_count值,会在IO上节省节省一些时间。
SQL> show parameter db_file
NAME TYPE VALUE
db_file_multiblock_read_count integer 128
SQL> alter session set db_file_multiblock_read_count=256;
Session altered.
SQL> show parameter db_file
NAME TYPE VALUE
db_file_multiblock_read_count integer 256
补充方法2:我们知道索引都是有序的,利用索引的这个特性,因此我们可以想到,在创建索引时,要把索引列的值拿到内存中进行排序,因此我们调整排序区的大小(sort_area_size),建立索引时要对大量数据进行排序操作 在oracle11g,如果workarea_size_policy的值为AUTO,sort_area_size将被忽略,pga_aggregate_target将被启用,pga_aggregate_target决定了整个 的pga大小,而且一个session并不能使用全部的pga大小,它受到一个隐藏参数的限制,大致能使用pga_agregate_target的5%,因此可以 考虑将workarea_size_policy的值为manual,然后设置较大的sort_area_size以满足需求。
SQL> alter system set workarea_size_policy=‘MANUAL’;
System altered.
SQL> alter session set sort_area_size=204800;
Session altered.
SQL> show parameter sort_area_size;
NAME TYPE VALUE
sort_area_size integer 204800
补充方法3 :为了让添加索引的表能尽快加载到数据缓存区中buffer cache,我们可以使用cache和full hint对源表做fts,以使它尽可能的出现在 buffer cache中LRU的MRU一端。
SQL> select /*+ cache(t) full(t) / count() from big_table t;
打扫战场:添加完索引后,把打扫一下战场,把战场恢复到操作之前,因此我们要把调整的参数进行恢复到原来的样子。
SQL> alter system set workarea_size_policy=‘AUTO’;
System altered.
SQL> alter session set db_file_multiblock_read_count = 128;
Session altered.
相关文章:
Oracle 大表添加索引的最佳方式
背景: 业务系统中现在经常存在上亿数据的大表,在这样的大表上新建索引,是一个较为耗时的操作,特别是在生产环境的系统中,添加不当,有可能造成业务表锁表,业务表长时间的停服势必会影响正常业务…...
速度了解云原生后端!!!
云原生后端是指基于云计算技术和理念构建的后端系统架构,旨在充分利用云计算的优势,实现快速部署、弹性扩展、高可用性和高效运维。以下是云原生后端的一些关键特点和技术: 容器化 容器化是云原生架构的核心之一,它使用容器技术&…...
云计算Openstack 虚拟机调度策略
OpenStack的虚拟机调度策略是一个复杂而灵活的系统,它主要由两种调度器实现:FilterScheduler(过滤调度器)和ChanceScheduler(随机调度器)。以下是对这两种调度器及其调度策略的详细解释: 一、F…...
在 macOS 上添加 hosts 文件解析的步骤
步骤 1: 打开 hosts 文件 打开终端: 你可以通过 Spotlight 搜索(按 Cmd Space 并输入 Terminal)来打开终端。 使用文本编辑器打开 hosts 文件: 在终端中输入以下命令,使用 nano 文本编辑器打开 hosts 文件:…...
RHCE【防火墙】
目录 一、防火墙简介 二、iptables 实验一:搭建web服务,设置任何人能够通过80端口访问。 实验二:禁止所有人ssh远程登录该服务器 实验三:禁止某个主机地址ssh远程登录该服务器,允许该主机访问服务器的web服务。服…...
基于springboot的招聘系统的设计与实现
摘 要 随着互联网时代的发展,传统的线下管理技术已无法高效、便捷的管理信息。为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生,国家在工作岗位要求不断提高的前提下,招聘系统建设也逐渐进入了信息化时代。…...
长度最小的子数组(滑动窗口)
给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 子数组 [numsl, numsl1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。 示例 1: 输入…...
构建灵活、高效的HTTP/1.1应用:探索h11库
文章目录 构建灵活、高效的HTTP/1.1应用:探索h11库背景这个库是什么?如何安装这个库?库函数使用方法使用场景常见的Bug及解决方案总结 构建灵活、高效的HTTP/1.1应用:探索h11库 背景 在现代网络应用中,HTTP协议是基础…...
大学英语救星!GPT助你完美解答完型填空和阅读理解
文章目录 零、前言一、再来十篇完型填空和阅读理解操作指导拍照:完型填空拍照:阅读理解 二、感受 零、前言 学习过程中,总是会遇到一些问题,但不好意思总是去麻烦问老师或同学 gpt可以帮社恐的你,解决学习问题&#…...
【linux】centos编译安装openssl1.1.1
文章目录 背景用途编译安装openssl1.1.1d测试centos的python2 ssl模块是否正常pyenv编译python3.10需要配置环境变量(必须)编译python前记得安装依赖 背景 首先, centos7 通过yum安装的openssl-devel包是1.0.2k的,这玩意儿太老了。我们选择从源码安装op…...
SpringBoot环境下的学生请假管理平台开发
2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统,它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等,非常…...
基于Transformer的路径规划 - 第五篇 GPT生成策略_解码方法优化
上一篇:基于Transformer的路径规划 - 第四篇 GPT模型优化 在上一篇中,我尝试优化GPT路径生成模型,但没有成功。在随机生成的测试集上,路径规划成功率只有99%左右。而使用传统的路径规划算法,例如A*,路径规划…...
项目模块十三:Util模块
一、项目设计思路 用于之后协议使用的工具类 二、静态成员函数 1、分割函数 static size_t Split(const string &src, const string &sep, vector<string> *array) string.find(const string &str, size_t pos 0) string.substr(size_t pos 0, size_t…...
10款舞台剧免费音频剪辑软件分享,你用过哪款?
在舞台剧的世界里,音乐是情感的传递者,是气氛的营造者。一个好的舞台剧,离不开精心剪辑的背景音乐。而选择合适的音频剪辑软件,就如同挑选舞台上的演员一样重要。今天,我们就从舞台剧音乐剪辑的角度,来聊聊…...
Redis常见面试题:ZSet底层数据结构,SDS、压缩列表ZipList、跳表SkipList
文章目录 一、Redis数据结构概述1.1 Redis有哪些数据类型1.2 Redis本质是哈希表1.3 Redis的哈希冲突与渐进式rehash1.4 数据结构底层1.4.1 简单动态字符串SDS1.4.2 双向链表(后续已废弃)1.4.3 压缩列表ZipList1.4.4 哈希表HashTable1.4.5 跳表SkipList1.…...
496.下一个更大元素Ⅰ
老样子,题目:496. 下一个更大元素 I - 力扣(LeetCode) 题解:代码随想录 AC代码: class Solution {public int[] nextGreaterElement(int[] nums1, int[] nums2) {Stack<Integer> stacknew Stack&l…...
C++类和对象上
1. 类的定义 1.1 类定义格式 • class为定义类的关键字,Stack为类的名字,{}中为类的主体,注意类定义结束时后⾯分号不能省略。类体中内容称为类的成员:类中的变量称为类的属性或成员变量; 类中的函数称为类的⽅法或者成员函数。…...
《图像边缘检测算法综述》
在当今的数字时代,图像处理技术在各个领域都发挥着至关重要的作用。其中,边缘检测作为图像处理中的一个关键任务,旨在识别图像中亮度变化显著的区域,进而提取出物体的轮廓和形状。边缘检测不仅是图像处理的基础技术,还…...
Git 使用指南:从基础到实战
Git 是目前最流行的分布式版本控制系统,广泛应用于软件开发、项目协作和版本管理。本文详细介绍 Git 的基础操作、工作流程、分支管理、常见问题解决方法以及进阶技巧,帮助开发者在日常工作中高效地使用 Git。 目录 一、Git 基础概念1.1 版本控制1.2 Git…...
新生代对象垃圾回收如何避免全堆扫描
新生代垃圾回收如何避免全堆扫描:通过卡表 写屏障避免全堆扫描 卡表: 在做YGC的时候,需要判断年轻代里面的对象哪些是垃圾,这些对象可能被老年代的对象引用, 这时候判断年轻代的某个对象是不是垃圾的时候࿰…...
日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南
1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
Vue ③-生命周期 || 脚手架
生命周期 思考:什么时候可以发送初始化渲染请求?(越早越好) 什么时候可以开始操作dom?(至少dom得渲染出来) Vue生命周期: 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…...
解析两阶段提交与三阶段提交的核心差异及MySQL实现方案
引言 在分布式系统的事务处理中,如何保障跨节点数据操作的一致性始终是核心挑战。经典的两阶段提交协议(2PC)通过准备阶段与提交阶段的协调机制,以同步决策模式确保事务原子性。其改进版本三阶段提交协议(3PC…...
02.运算符
目录 什么是运算符 算术运算符 1.基本四则运算符 2.增量运算符 3.自增/自减运算符 关系运算符 逻辑运算符 &&:逻辑与 ||:逻辑或 !:逻辑非 短路求值 位运算符 按位与&: 按位或 | 按位取反~ …...
针对药品仓库的效期管理问题,如何利用WMS系统“破局”
案例: 某医药分销企业,主要经营各类药品的批发与零售。由于药品的特殊性,效期管理至关重要,但该企业一直面临效期问题的困扰。在未使用WMS系统之前,其药品入库、存储、出库等环节的效期管理主要依赖人工记录与检查。库…...
