数据库开发常识(10.6)——SQL性能判断标准及索引误区(1)

ops/2025/2/5 15:48:23/

10.6.  数据库开发常识

作为一名专业数据库开发人员,不但需要掌握数据库开发相关的语法和功能实现,还要掌握专业数据库开发的常识。这样,才能在保量完成工作任务的同时,也保质的完成工作任务,避免了为应用的日后维护埋下性能和稳定性方面的隐患。可遗憾的是,现实中,很大一部分的专业开发人员只能做到保量的完成工作任务,而做不到既保量也保质。这也就不难解释,现实中,为什么很多应用系统上线后,性能和稳定性等方面还频繁的出现问题。

这里所谓的数据库开发常识,指经过长期不断的基础理论和实践经验的积累与沉淀,专业人员获得的数据库开发方面的规律和结论,用以帮助提高数据库开发工作的效率,更重要的是保证开发成果的质量。

下面仅就实际工作中最常遇到的,也是最常用到的数据库开发常识进行介绍和说明,以期对各位有所启发和帮助。

10.6.1. 判断SQL性能标准

目前几乎所有高版本关系库(RDB,Relational Database)的优化器都是CBO(见本专栏6.1节)的,那么,判断一条SQL语句性能好坏的标准只有一个,那就是执行计划(Explain Plan)及其成本。拿到一条SQL语句的执行计划前,我们没办法准确判断其性能的好坏及问题所在。因此,我们不但要掌握获取执行计划的方法,也要学会查看和分析执行计划,起码要会查看和分析简单的执行计划。

10.6.2. 索引相关误区

1)走索引一定是最优的。

查看和分析执行计划时,有一个大家似乎公认的调优原则,那就是:走FTS就一定是错的,存在性能问题的;走index就一定是对的,是最优的。针对这种观点,我只能说:不一定,要看具体的实际情况。大家先考虑下为什么这么说?为了便于理解,我们考虑两个比较极端的场景。

  • 第一个场景,假设表里的数据比较少,一个数据块就能容纳,并且,表的相应列上有B*Tree索引,假设索引也只有一个数据块。我们哪怕只访问表里的一条数据时,当不走索引时,我们只需读取一个数据块就可以,那就是表的所有数据块;如果走索引,那么,就得读取两个数据块,先读索引块,然后,读表的数据块,大家比较下,哪个成本高哪个成本低呢?
  • 另一个场景,假设一个表有100个数据块,索引有20个数据块。当我们读取表里90%的数据时,如果不走索引,那么,只需要读取表的100个数据块;而如果走索引,就得读取至少18+90=108个数据块。这么看,走索引似乎有点得不偿失,大家比较下,该场景下,哪个成本高哪个成本低呢?
  • 当然,以上只是通过这两个极端、理想的场景说明一个道理:走index未必最优,走FTS也未必就有问题。现实中,场景和成本计算都要比这里复杂得多,也还会涉及到其他概念和因素,例如:FTS的并行多块读,index的顺序读,索引的聚簇因子(Cluster Factor)等,这些都会影响SQL语句的最终执行计划。

--注:

      1)大家思考下,当读取相同的数据块数时,并行多块读和顺序读的区别和结果分别是什么?

      2)这里大家需要思考一个问题,那就是在现实工作中,有时查询一张表所读取的数据块数比整张表的数据块数还要多,有时是整张表数据块数的几倍甚至几十倍,为什么?

2)索引可随便创建

现实工作中,很多公司或机构的开发库、测试库甚至生产库的管理和权限控制,既很不严格,也非常不规范。所有或部分员工都可以随便访问数据库,且都拥有修改数据、建立、删除索引及其他对象,甚至数据库的最高权限。现实中,由于员工随便删除索引导致事故的案例并不稀奇,因员工随便乱建索引而引发数据库负载居高不下、性能陡降,甚至引起严重事故的现象也是屡见不鲜。

因此,规范数据库管理和严控数据库权限,尤其是机构生产库的管理和权限,会很大程度上避免事故的发生和减少由此带来的损失。由此,也杜绝了无序的乱建索引而引发的一系列问题和后果。现实工作中,除非确定索引能极大的改善某个应用模块或操作的性能,且不会对其他应用模块或操作带来负面影响,否则,还是三思而后行,最好通过规范的流程和渠道去分析、确定和实施索引策略。

--注:

      1)大家思考下,删除索引为什么会导致事故?随便建索引又为什么会导致负载居高不下、性能陡降,甚至引起事故?


http://www.ppmy.cn/ops/155912.html

相关文章

7、怎么定义一个简单的自动化测试框架?

定义一个简单的自动化测试框架可以从需求理解、框架设计、核心模块实现、测试用例编写和集成执行等方面入手,以下为你详细介绍: 1. 明确框架需求和范围 确定测试类型:明确框架要支持的测试类型,如单元测试、接口测试、UI 测试等…

TGT-HC:一种用于无线时间敏感网络的时隙感知整形MAC方案的调研、设计与评估

论文标题 中文标题:TGT-HC:一种用于无线时间敏感网络的时隙感知整形MAC方案的调研、设计与评估 英文标题:Survey, Design and Evaluation of TGT-HC: A Time-Aware Shaper MAC for Wireless TSN 作者信息 Raymond J. Jayabal(I…

kamailio-ACC_JSON模块详解【后端语言go】

要确认 ACC_JSON 模块是否已经成功将计费信息推送到消息队列(MQueue),以及如何从队列中取值,可以按照以下步骤进行操作: 1. 确认 ACC_JSON 已推送到队列 1.1 配置 ACC_JSON 确保 ACC_JSON 模块已正确配置并启用。以下…

STM32-时钟树

STM32-时钟树 时钟 时钟

基于FPGA的BT1120编解码

BT1120与BT656 类似 BT1120与BT656同类属于一个视频协议,两者无论从组成、协议、同步码以及传输过程都是十分相似: 1、两者都是以F(场)、V(帧)、H(消隐)、D(有效)来区分数据的内容。 2、两者的传输数据都采用一样的方式,即内同步传输数据。 3、两者都传输的数据都是…

算法设计-哈夫曼树(C++)

一、详细代码 算法原理&#xff1a; Huffman编码是一种用于数据压缩的算法&#xff0c;它通过为出现频率较高的字符分配较短的编码&#xff0c;而为出现频率较低的字符分配较长的编码&#xff0c;从而实现数据的压缩。 #include <iostream> #include <queue> #in…

Spring Boot - 数据库集成06 - 集成ElasticSearch

Spring boot 集成 ElasticSearch 文章目录 Spring boot 集成 ElasticSearch一&#xff1a;前置工作1&#xff1a;项目搭建和依赖导入2&#xff1a;客户端连接相关构建3&#xff1a;实体类相关注解配置说明 二&#xff1a;客户端client相关操作说明1&#xff1a;检索流程1.1&…

课题推荐——基于自适应滤波技术的多传感器融合在无人机组合导航中的应用研究

无人机在现代航空、农业和监测等领域的应用日益广泛。为了提高导航精度&#xff0c;通常采用多传感器融合技术&#xff0c;将来自GPS、惯性测量单元&#xff08;IMU&#xff09;、磁力计等不同传感器的数据整合。然而&#xff0c;传感器的量测偏差、环境干扰以及非线性特性使得…