当前位置: 首页 > news >正文

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 文件&#xff1a…...

RHCE【防火墙】

目录 一、防火墙简介 二、iptables 实验一:搭建web服务,设置任何人能够通过80端口访问。 实验二:禁止所有人ssh远程登录该服务器 实验三:禁止某个主机地址ssh远程登录该服务器,允许该主机访问服务器的web服务。服…...

基于springboot的招聘系统的设计与实现

摘 要 随着互联网时代的发展,传统的线下管理技术已无法高效、便捷的管理信息。为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生,国家在工作岗位要求不断提高的前提下,招聘系统建设也逐渐进入了信息化时代。…...

长度最小的子数组(滑动窗口)

给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 子数组 [numsl, numsl1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。 示例 1: 输入&#xf…...

构建灵活、高效的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款舞台剧免费音频剪辑软件分享,你用过哪款?

在舞台剧的世界里&#xff0c;音乐是情感的传递者&#xff0c;是气氛的营造者。一个好的舞台剧&#xff0c;离不开精心剪辑的背景音乐。而选择合适的音频剪辑软件&#xff0c;就如同挑选舞台上的演员一样重要。今天&#xff0c;我们就从舞台剧音乐剪辑的角度&#xff0c;来聊聊…...

Redis常见面试题:ZSet底层数据结构,SDS、压缩列表ZipList、跳表SkipList

文章目录 一、Redis数据结构概述1.1 Redis有哪些数据类型1.2 Redis本质是哈希表1.3 Redis的哈希冲突与渐进式rehash1.4 数据结构底层1.4.1 简单动态字符串SDS1.4.2 双向链表&#xff08;后续已废弃&#xff09;1.4.3 压缩列表ZipList1.4.4 哈希表HashTable1.4.5 跳表SkipList1.…...

496.下一个更大元素Ⅰ

老样子&#xff0c;题目&#xff1a;496. 下一个更大元素 I - 力扣&#xff08;LeetCode&#xff09; 题解&#xff1a;代码随想录 AC代码&#xff1a; class Solution {public int[] nextGreaterElement(int[] nums1, int[] nums2) {Stack<Integer> stacknew Stack&l…...

C++类和对象上

1. 类的定义 1.1 类定义格式 • class为定义类的关键字&#xff0c;Stack为类的名字&#xff0c;{}中为类的主体&#xff0c;注意类定义结束时后⾯分号不能省略。类体中内容称为类的成员&#xff1a;类中的变量称为类的属性或成员变量; 类中的函数称为类的⽅法或者成员函数。…...

《图像边缘检测算法综述》

在当今的数字时代&#xff0c;图像处理技术在各个领域都发挥着至关重要的作用。其中&#xff0c;边缘检测作为图像处理中的一个关键任务&#xff0c;旨在识别图像中亮度变化显著的区域&#xff0c;进而提取出物体的轮廓和形状。边缘检测不仅是图像处理的基础技术&#xff0c;还…...

Git 使用指南:从基础到实战

Git 是目前最流行的分布式版本控制系统&#xff0c;广泛应用于软件开发、项目协作和版本管理。本文详细介绍 Git 的基础操作、工作流程、分支管理、常见问题解决方法以及进阶技巧&#xff0c;帮助开发者在日常工作中高效地使用 Git。 目录 一、Git 基础概念1.1 版本控制1.2 Git…...

新生代对象垃圾回收如何避免全堆扫描

新生代垃圾回收如何避免全堆扫描&#xff1a;通过卡表 写屏障避免全堆扫描 卡表&#xff1a; 在做YGC的时候&#xff0c;需要判断年轻代里面的对象哪些是垃圾&#xff0c;这些对象可能被老年代的对象引用&#xff0c; 这时候判断年轻代的某个对象是不是垃圾的时候&#xff0…...

Flask RESTful 示例

目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题&#xff1a; 下面创建一个简单的Flask RESTful API示例。首先&#xff0c;我们需要创建环境&#xff0c;安装必要的依赖&#xff0c;然后…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

电脑插入多块移动硬盘后经常出现卡顿和蓝屏

当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时&#xff0c;可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案&#xff1a; 1. 检查电源供电问题 问题原因&#xff1a;多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

Python爬虫(一):爬虫伪装

一、网站防爬机制概述 在当今互联网环境中&#xff0c;具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类&#xff1a; 身份验证机制&#xff1a;直接将未经授权的爬虫阻挡在外反爬技术体系&#xff1a;通过各种技术手段增加爬虫获取数据的难度…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾&#xff1a; 在上一篇中&#xff0c;我们成功地为应用集成了数据库&#xff0c;并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了&#xff01;但是&#xff0c;如果你仔细审视那些 API&#xff0c;会发现它们还很“粗糙”&#xff1a;有…...

【Java_EE】Spring MVC

目录 Spring Web MVC ​编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 ​编辑参数重命名 RequestParam ​编辑​编辑传递集合 RequestParam 传递JSON数据 ​编辑RequestBody ​…...

微信小程序云开发平台MySQL的连接方式

注&#xff1a;微信小程序云开发平台指的是腾讯云开发 先给结论&#xff1a;微信小程序云开发平台的MySQL&#xff0c;无法通过获取数据库连接信息的方式进行连接&#xff0c;连接只能通过云开发的SDK连接&#xff0c;具体要参考官方文档&#xff1a; 为什么&#xff1f; 因为…...

Java线上CPU飙高问题排查全指南

一、引言 在Java应用的线上运行环境中&#xff0c;CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时&#xff0c;通常会导致应用响应缓慢&#xff0c;甚至服务不可用&#xff0c;严重影响用户体验和业务运行。因此&#xff0c;掌握一套科学有效的CPU飙高问题排查方法&…...

Python ROS2【机器人中间件框架】 简介

销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

技术栈RabbitMq的介绍和使用

目录 1. 什么是消息队列&#xff1f;2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...