openGauss学习笔记-73 openGauss 数据库管理-创建和管理索引

news2024/11/26 13:45:58

文章目录

    • openGauss学习笔记-73 openGauss 数据库管理-创建和管理索引
      • 73.1 背景信息
      • 73.2 操作步骤
        • 73.2.1 创建索引
        • 73.2.2 修改索引分区的表空间
        • 73.2.3 重命名索引分区
        • 73.2.4 查询索引
        • 73.2.5 删除索引
        • 73.2.6 创建索引的方式
          • 73.2.6.1 创建普通索引
          • 73.2.6.2 创建多字段索引
          • 73.2.6.3 创建部分索引
          • 73.2.6.4 创建表达式索引

openGauss学习笔记-73 openGauss 数据库管理-创建和管理索引

73.1 背景信息

索引可以提高数据的访问速度,但同时也增加了插入、更新和删除操作的处理时间。所以是否要为表增加索引,索引建立在哪些字段上,是创建索引前必须要考虑的问题。需要分析应用程序的业务处理、数据使用、经常被用作查询的条件或者被要求排序的字段来确定是否建立索引。

索引建立在数据库表中的某些列上。因此,在创建索引时,应该仔细考虑在哪些列上创建索引。

  • 在经常需要搜索查询的列上创建索引,可以加快搜索的速度。

  • 在作为主键的列上创建索引,强制该列的唯一性和组织表中数据的排列结构。

  • 在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的。

  • 在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间。

  • 在经常使用WHERE子句的列上创建索引,加快条件的判断速度。

  • 为经常出现在关键字ORDER BY、GROUP BY、DISTINCT后面的字段建立索引。

    img 说明:

    • 索引创建成功后,系统会自动判断何时引用索引。当系统认为使用索引比顺序扫描更快时,就会使用索引。
    • 索引创建成功后,必须和表保持同步以保证能够准确地找到新数据,这样就增加了数据操作的负荷。因此请定期删除无用的索引。
    • 分区表索引分为LOCAL索引与GLOBAL索引,一个LOCAL索引对应一个具体分区,而GLOBAL索引则对应整个分区表。
  • 在开启逻辑复制的场景下,如需创建包含系统列的主键索引,必须将该表的REPLICA IDENTITY属性设置为FULL或是使用USING INDEX指定不包含系统列的、唯一的、非局部的、不可延迟的、仅包括标记为NOT NULL的列的索引。

73.2 操作步骤

创建分区表的步骤请参考创建和管理分区表

73.2.1 创建索引
  • 创建分区表LOCAL索引tpcds_web_returns_p2_index1,不指定索引分区的名称。

    openGauss=# CREATE INDEX tpcds_web_returns_p2_index1 ON tpcds.web_returns_p2 (ca_address_id) LOCAL;
    

    当结果显示为如下信息,则表示创建成功。

    CREATE INDEX
    
  • 创建分区表LOCAL索引tpcds_web_returns_p2_index2,并指定索引分区的名称。

    openGauss=# CREATE INDEX tpcds_web_returns_p2_index2 ON tpcds.web_returns_p2 (ca_address_sk) LOCAL
    (
        PARTITION web_returns_p2_P1_index,
        PARTITION web_returns_p2_P2_index TABLESPACE example3,
        PARTITION web_returns_p2_P3_index TABLESPACE example4,
        PARTITION web_returns_p2_P4_index,
        PARTITION web_returns_p2_P5_index,
        PARTITION web_returns_p2_P6_index,
        PARTITION web_returns_p2_P7_index,
        PARTITION web_returns_p2_P8_index
    ) TABLESPACE example2;
    

    当结果显示为如下信息,则表示创建成功。

    CREATE INDEX
    
  • 创建分区表GLOBAL索引tpcds_web_returns_p2_global_index。

    openGauss=# CREATE INDEX tpcds_web_returns_p2_global_index ON tpcds.web_returns_p2 (ca_street_number) GLOBAL;
    
73.2.2 修改索引分区的表空间
  • 修改索引分区_web_returns_p2_P2_index_的表空间为example1。

    openGauss=# ALTER INDEX tpcds.tpcds_web_returns_p2_index2 MOVE PARTITION web_returns_p2_P2_index TABLESPACE example1;
    

    当结果显示为如下信息,则表示修改成功。

    ALTER INDEX
    
  • 修改索引分区_web_returns_p2_P3_index_的表空间为example2。

    openGauss=# ALTER INDEX tpcds.tpcds_web_returns_p2_index2 MOVE PARTITION web_returns_p2_P3_index TABLESPACE example2;
    

    当结果显示为如下信息,则表示修改成功。

    ALTER INDEX
    
73.2.3 重命名索引分区

执行如下命令对索引分区_web_returns_p2_P8_index_重命名_web_returns_p2_P8_index__new。

openGauss=# ALTER INDEX tpcds.tpcds_web_returns_p2_index2 RENAME PARTITION web_returns_p2_P8_index TO web_returns_p2_P8_index_new;

当结果显示为如下信息,则表示重命名成功。

ALTER INDEX
73.2.4 查询索引
  • 执行如下命令查询系统和用户定义的所有索引。

    openGauss=# SELECT RELNAME FROM PG_CLASS WHERE RELKIND='i' or RELKIND='I';
    
  • 执行如下命令查询指定索引的信息。

    openGauss=# \di+ tpcds.tpcds_web_returns_p2_index2 
    
73.2.5 删除索引
openGauss=# DROP INDEX tpcds.tpcds_web_returns_p2_index1;
openGauss=# DROP INDEX tpcds.tpcds_web_returns_p2_index2;

当结果显示为如下信息,则表示删除成功。

DROP INDEX
73.2.6 创建索引的方式

openGauss支持4种创建索引的方式请参见表1

img 说明:

  • 索引创建成功后,系统会自动判断何时引用索引。当系统认为使用索引比顺序扫描更快时,就会使用索引。
  • 索引创建成功后,必须和表保持同步以保证能够准确地找到新数据,这样就增加了数据操作的负荷。因此请定期删除无用的索引。

表 1 索引方式

索引方式描述
唯一索引可用于约束索引属性值的唯一性,或者属性组合值的唯一性。如果一个表声明了唯一约束或者主键,则openGauss自动在组成主键或唯一约束的字段上创建唯一索引(可能是多字段索引),以实现这些约束。目前,openGauss只有B-Tree可以创建唯一索引。
多字段索引一个索引可以定义在表中的多个属性上。目前,openGauss中的B-Tree支持多字段索引,且最多可在32个字段上创建索引(全局分区索引最多支持31个字段)。
部分索引建立在一个表的子集上的索引,这种索引方式只包含满足条件表达式的元组。
表达式索引索引建立在一个函数或者从表中一个或多个属性计算出来的表达式上。表达式索引只有在查询时使用与创建时相同的表达式才会起作用。
  • 创建一个普通表
openGauss=# CREATE TABLE tpcds.customer_address_bak AS TABLE tpcds.customer_address;
INSERT 0 0
73.2.6.1 创建普通索引

如果对于tpcds.customer_address_bak表,需要经常进行以下查询。

openGauss=# SELECT ca_address_sk FROM tpcds.customer_address_bak WHERE ca_address_sk=14888;

通常,数据库系统需要逐行扫描整个tpcds.customer_address_bak表以寻找所有匹配的元组。如果表tpcds.customer_address_bak的规模很大,但满足WHERE条件的只有少数几个(可能是零个或一个),则这种顺序扫描的性能就比较差。如果让数据库系统在ca_address_sk属性上维护一个索引,用于快速定位匹配的元组,则数据库系统只需要在搜索树上查找少数的几层就可以找到匹配的元组,这将会大大提高数据查询的性能。同样,在数据库中进行更新和删除操作时,索引也可以提升这些操作的性能。

使用以下命令创建索引。

openGauss=# CREATE INDEX index_wr_returned_date_sk ON tpcds.customer_address_bak (ca_address_sk);
CREATE INDEX
73.2.6.2 创建多字段索引

假如用户需要经常查询表tpcds.customer_address_bak中ca_address_sk是5050,且ca_street_number小于1000的记录,使用以下命令进行查询。

openGauss=# SELECT ca_address_sk,ca_address_id FROM tpcds.customer_address_bak WHERE ca_address_sk = 5050 AND ca_street_number < 1000;

使用以下命令在字段ca_address_sk和ca_street_number上定义一个多字段索引。

openGauss=# CREATE INDEX more_column_index ON tpcds.customer_address_bak(ca_address_sk ,ca_street_number );
CREATE INDEX
73.2.6.3 创建部分索引

如果只需要查询ca_address_sk为5050的记录,可以创建部分索引来提升查询效率。

openGauss=# CREATE INDEX part_index ON tpcds.customer_address_bak(ca_address_sk) WHERE ca_address_sk = 5050;
CREATE INDEX
73.2.6.4 创建表达式索引

假如经常需要查询ca_street_number小于1000的信息,执行如下命令进行查询。

openGauss=# SELECT * FROM tpcds.customer_address_bak WHERE trunc(ca_street_number) < 1000;

可以为上面的查询创建表达式索引:

openGauss=# CREATE INDEX para_index ON tpcds.customer_address_bak (trunc(ca_street_number));
CREATE INDEX
  • 删除tpcds.customer_address_bak表

    openGauss=# DROP TABLE tpcds.customer_address_bak;
    DROP TABLE
    

👍 点赞,你的认可是我创作的动力!

⭐️ 收藏,你的青睐是我努力的方向!

✏️ 评论,你的意见是我进步的财富!

图片

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1029167.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

升级iOS17后可以降级吗?iOS17退回iOS16方法教程分享

iOS 17已上线几天&#xff0c;从网上用户的反馈和媒体机构的报告来看&#xff0c;iOS17系统对旧机型来说并不友好&#xff0c;除了电池续航下降以外&#xff0c;占用大量储存空间&#xff0c;BUG也不少。 苹果于 9 月 7 日发布了 iOS 16.6.1 版本&#xff0c;如果升级iOS17后发…

opencv实现仿射变换

什么是仿射变换&#xff1f; 代码实现 import numpy as np import cv2 as cv import matplotlib.pyplot as plt#设置字体 from pylab import mpl mpl.rcParams[font.sans-serif] [SimHei]#图像的读取 img cv.imread("lena.png")#仿射变换 rows , cols img.shape[…

计算机视觉与深度学习-全连接神经网络-训练过程-模型正则与超参数调优- [北邮鲁鹏]

目录标题 神经网络中的超参数学习率超参数优化方法网格搜索法随机搜索法 超参数搜索策略粗搜索精搜索 超参数的标尺空间 神经网络中的超参数 超参数 网络结构&#xff1a;隐层神经元个数&#xff0c;网络层数&#xff0c;非线性单元选择等优化相关&#xff1a;学习率、dorpou…

期权如何交易?期权如何做模拟交易?

买卖期权的第一步就是要有期权账户&#xff0c;国内的期权品种有商品期权和ETF期权以及股指期权&#xff0c;每种的开户方式和要求都不同&#xff0c;下文为大家介绍期权如何交易&#xff1f;期权如何做模拟交易&#xff1f; 一、期权交易需要开立一个期权账户&#xff0c;可以…

OpenCV图像金字塔

什么是图像金字塔&#xff1f; 向上采样 &#xff1a;cv.pyrUp(img) 向下采样 : cv.pyrDown(img) 代码实现 import numpy as np import cv2 as cv import matplotlib.pyplot as plt#图像的读取 img cv.imread("lena.png")#进行图像采样 up_img cv.pyrUp(img) #上…

互联网3.0 数字原生——数物虚实多维细粒度泛在融合

随着计算机、宽带网、通信技术的飞速发展&#xff0c;互联网技术和软硬件系统也不断演进&#xff0c;催生了一场前所未有的数字化革命。从Web1.0到Web3.0&#xff0c;以及虚拟现实、人工智能和数字孪生等领域的崛起&#xff0c;每一步都勾画出了一个崭新的数字未来&#xff0c;…

云渲染是怎么做到不排队的

云渲染排队严重影响了用户的使用体验&#xff0c;还会导致用户的流失&#xff0c;因此解决渲染不排队的问题对于云渲染平台来说是非常重要的。而作为云渲染平台&#xff0c;自己的机器基本都是固定的&#xff0c;哪如何解决用户渲染排队的问题呢&#xff1f;我们一起来看看全国…

60从零开始学Java之与数字相关的类有哪些?

作者&#xff1a;孙玉昌&#xff0c;昵称【一一哥】&#xff0c;另外【壹壹哥】也是我哦 千锋教育高级教研员、CSDN博客专家、万粉博主、阿里云专家博主、掘金优质作者 前言 我们在解决实际问题时&#xff0c;会经常对数字、日期和系统设置进行处理&#xff0c;比如在我们的代…

转一篇文章-搜狗输入法出现繁体消除不了怎么办?

省流&#xff1a;ctrlshiftf 详见此人的实验 搜狗拼音突然成繁体字了怎么办&#xff1f; - 简书使用搜狗输入法&#xff0c;总是莫名的出现繁体字&#xff0c;打开设置选择的也是简体&#xff0c;但是打字就是繁体&#xff0c;最近终于摸索出来一次成功解决的方法&#xff0c…

git rebase 修改中间的commit

0. 前言 今天在移植最新版本 kfence 功能的时候&#xff0c;一共需要移植大概40多个 patch&#xff0c;中间有很多patch 存在冲突&#xff0c;需要手动修改后才能合并。当所有的patch 都合并完成进行编译的时候&#xff0c;发现其中一个 patch 手动合并出了个错误。 假如共有…

springboot整合sentinel完成限流

1、直入正题&#xff0c;下载sentinel的jar包 1.1 直接到Sentinel官网里的releases下即可下载最新版本&#xff0c;Sentinel官方下载地址&#xff0c;直接下载jar包即可。不过慢&#xff0c;可能下载不下来 1.2 可以去gitee去下载jar包 1.3 下载完成后&#xff0c;进行打包…

仪表基础知识培训

压力传感器:E+H PMX5x/FMX5x 一、安装:安装注意事项: 1、水平安装时仪表的呼吸孔(1)需要向下安装,并远离污染物。 2、请勿用坚硬的物体擦拭或接触膜片。 3、请勿安装在水泵的入口和搅拌叶附近 二、供电、接线、信号、:二线制,仪表输出4-20mA 三、量程:设置最大最小量程…

VS中cmake多配置构建设置

一.cmake在vs中的使用简介 CMake 是一种跨平台开源工具&#xff0c;用于定义在多个平台上运行的生成过程。 Visual Studio C 和 C 开发不再仅适用于 Windows。 本教程介绍如何在 Windows 和 Linux 上使用 Visual Studio C 进行跨平台开发。 由于它基于 CMake&#xff0c;无需…

VR虚拟展厅——商业领域中不可或缺的工具

VR虚拟展厅已经逐渐在商业领域崭露头角&#xff0c;将实体展厅以三维、立体化的形式还原在线上&#xff0c;企业能够以更加直观、真实的方式展示自身的形象和产品&#xff0c;用户也得以通过VR虚拟展厅全方位了解产品详情&#xff0c;包括图片展示、视频介绍等&#xff0c;更加…

websocket php教程

WebSocket 是 HTML5 提供的一种网络通讯协议&#xff0c;用于服务端与客户端实时数据传输。广泛用于浏览器与服务器的实时通讯&#xff0c;APP与服务器的实时通讯等场景。 相比传统HTTP协议请求响应式通讯&#xff0c;WebSocket协议可以做到实时的双向通讯&#xff0c;服务端可…

Automation Anywhere推出新的生成式AI自动化平台,加速提高企业生产力

在9 月 19 日的Imagine 2023 大会上&#xff0c;智能自动化领域的领导者 Automation Anywhere 宣布对其自动化平台进行扩展。推出了新的 Responsible AI Layer&#xff0c;并宣布了四项关键产品更新&#xff0c;包括全新的 Autopilot&#xff0c;它可以利用生成式 AI &#xff…

IT隔离电源系统在医院电气设计中的应用

【摘要】许多国际标准都对医疗领域&#xff0c;尤其是那些生命攸关的场所&#xff0c;如手术室、重症监护室、心脏监护室等的配电系统作了特殊的规定。现在国际上针对医疗领域中的手术室、ICU、CCU等重要场所通常采用局部“中性点不接地的供电系统”&#xff08;IEC标准称之为“…

webpack:详解代码分离以及插件SplitChunksPlugin的使用

文章目录 背景入口起点分离基本使用防重复 SplitChunksPlugin插件分离背景基本使用splitChunks.chunkssplitChunks.minChunkssplitChunks.minSizesplitChunks.maxSizesplitChunks.namesplitChunks.cacheGroupssplitChunks.cacheGroups.{cacheGroup}.prioritysplitChunks.cacheG…

智能制造,RFID与流转线碰撞

智能制造&#xff0c;RFID与流转线碰撞 RFID是一种无线通信技术&#xff0c;可以用于实时识别和物品。它通过将包含有信息的标签贴在物品上&#xff0c;利用射频信号进行通信&#xff0c;将物品的信息传输给读取器。读取器可以通过无线方式读取标签上的信息&#xff0c;从而实…

公众环境关注如何提升企业ESG表现(2011-2022年)

参照陶云清&#xff08;2023&#xff09;的做法&#xff0c;本团队对来自“科学学与科学技术管理”《公众环境关注如何提升企业ESG表现&#xff1f;—基于外部压力与内部关注的双重视角》一文中的基准回归部分进行复刻。 如何驱动企业在逐利过程中兼顾环境、社会和治理表现&am…