11 月 19 - 20 日 Apache Pulsar 社区年度盛会来啦,立即报名! 了解详情
写点什么

宜信的 105 条数据库军规(一)

  • 2020-02-06
  • 本文字数:3460 字

    阅读完需:约 11 分钟

宜信的105条数据库军规(一)

作为一家金融科技企业,宜信的大量业务都依赖于数据库。如何提高公司整体数据库应用水平,是对 DBA 的一大挑战,也非常具有现实意义。笔者在宜信的多年工作中,与团队一起总结整理了针对传统关系型数据库的使用规则,并借助自研的数据库审核平台落地,借此帮助研发团队评估数据库开发质量,达到尽早发现问题、解决问题之目的。下图正是这一系统的简单原理图。


1572921020111074307.png


如上图所示,针对规则部分又可细分为如下分类(部分)。简单描述如下,后面将逐一详细说明。


1572921036432073060.png


一、Oracle 规则(对象)

1.1 表、分区

【规则 1】


规则说明:超过指定规模且没有分区的表。


规则阈值:2GB(物理大小超过指定阀值)。


规则描述:表的规模过大,将影响表的访问效率、增加维护成本等。常见的解决方案就是使用分区表,将大表转换为分区表。


【规则 2】


规则说明:单表或单分区记录数量过大。


规则阈值:1000000(单表或单分区记录数超过指定阀值)。


规则描述:控制单个表或单个分区的数据规模,提高单一对象的访问效率。如记录数过多,应考虑分库、分表、分区等策略。


【规则 3】


规则说明:大表过多。


规则阈值:自定义(超过 2G 的表的数量过多)。


规则描述:大表在所有表中所占比例超过 20%(OLTP)或 95%(OLAP)。


【规则 4】


规则说明:单表分区数量过多。


规则阈值:500(单表分区数量超过指定阀值)。


规则描述:分区表中分区数量过多,将导致整体维护成本过高,可调整分区粒度。


【规则 5】


规则说明:分区表数量过多。


规则阈值:2000(分区表数量超过指定阀值)。


规则描述:分区表过多,常见原因是大表较多。因根据需求,考虑进行垂直拆分,减小单库规模。


【规则 6】


规则说明:复合分区数量过多。


规则阈值:5(复合分区数量超过指定阀值)。


规则描述:同上面分区表数量过多理由类似(含有复合分区表的数量)。


【规则 7】


规则说明:存在启用并行属性的表。


规则阈值:1(表 degree 属性不为 1)。


规则描述:一般情况下不建议对表设置并行属性。


1.2 索引

【规则 8】


规则说明:外键没有索引的表。


规则描述:外键没有索引会导致主子表关联查询时,关联效率很低。


【规则 9】


规则说明:组合索引数量过多或没有索引。


规则描述:组合索引过多,将导致空间消耗较大、索引维护成本较高。应考虑构建战略性索引结构,不要针对每个需求都通过创建索引解决。


【规则 10】


规则说明:单表索引数量过多。


规则阈值:3(单表索引数量超过指定阀值)。


规则描述:索引可以提高访问速度,但数量过多将导致空间消耗过大,且索引维护成本较高,影响 DML 效率等问题。应控制索引数量。


【规则 11】


规则说明:存在 7 天内没有使用的索引。


规则描述:在数据库一段时间内,该索引没有被任何 SQL 语句使用。请评估此索引的有效性。


【规则 12】


规则说明:字段重复索引。 规则描述:一个字段被多个索引引用,请考虑构建策略,删除不必要的索引。


【规则 13】


规则说明:存在全局分区索引。


规则描述:全局分区索引,存在维护成本较高问题。当分区发生变化时,需要维护全局索引的有效性。


【规则 14】


规则说明:失效索引。 规则描述:索引状态为 INVALID、UNUSABLE。


【规则 15】


规则说明:索引高度超过指定高度。


规则阈值:4。


规则描述:索引高度过高导致增加 IO 成本。


【规则 16】


规则说明:存在位图索引。


规则描述:OLTP 环境中不建议使用位图索引,如果表对象经查做 DML 操作,会在一定程度上阻塞相关操作。


【规则 17】


规则说明:存在函数索引。


【规则 18】


规则说明:存在启用并行属性的索引。


规则阈值:1(索引 degree 属性不为 1)。


规则描述:一般情况下不建议对索引设置并行属性。


【规则 19】


规则说明:存在聚簇因子过大的索引。


规则阈值:自定义。


规则描述:聚簇因子过大的索引,应该考虑优化。


1.3 约束

【规则 20】


规则类别:约束。


规则说明:没有主键的表。


规则描述:主键是关系型数据库中唯一确定一条记录的依据,没有任何理由不定义主键。


【规则 21】


规则类别:约束。


规则说明:使用外键的表。


规则描述:不建议使用外键约束,数据一致性通过应用端解决。


1.4 字段

【规则 22】


规则说明:表字段过多。


规则阈值:100(字段数量超过指定阀值)。


规则描述:字段过多,会导致记录长度过大。单个数据存储单元将保存的记录数过少,影响访问效率。


【规则 23】


规则说明:包含有大字段类型的表。


规则描述:大对象字段是关系型数据库中应尽量避免的。如有需要,可考虑在外部进行存储。


【规则 24】


规则说明:记录长度定义过长。


规则描述:记录定义长度与实际存储长度差异过大,请考虑字段类型定义是否合理,个别字段过长是否可分表存储。


【规则 25】 规则说明:不包含时间戳字段的表。


规则描述:时间戳,是获取增量数据的一种方法。建议在表内增加创建时间、更新时间的时间戳字段。命名方式为 CREATE_TIME、UPDATE_TIME。


【规则 26】


规则说明:表字段类型不匹配。


规则描述:此规则会抽样部分数据,分析其定义类型与存储类型是否相符。常见问题如用数字、文本保存日期等。


1.5 其他对象

【规则 27】


规则说明:缓存过小的序列。


规则阈值:100(序列 cache 值小于指定阀值)。


规则描述:系统默认会缓存 20,如过小将导致频繁查询数据字典,影响并发能力。


【规则 28】


规则说明:存在存储过程及函数度。


规则阈值:20(存储过程和函数的数量超过指定阀值)。


规则描述:存储过程及函数,将影响数据库的异构迁移能力,并存在代码维护性较差等原因。


【规则 29】


规则说明:存在触发器。


规则阈值:20(触发器数量超过指定阀值)。


规则描述:触发器,将影响数据库的异构迁移能力。如有数据一致性维护需求,请从应用端给予考虑。


【规则 30】


规则说明:存在 DBLINK。


规则描述:不建议在一个数据库中访问其他数据库,请考虑在应用端解决。


二、Oracle 规则(执行计划)

2.1 绑定变量

【规则 31】


规则说明:未使用绑定变量。


规则阈值:自定义(执行次数)。


规则描述:执行次数超过一定阀值的语句,谓词右侧存在常量值。


【规则 32】


规则说明:绑定变量的数量过多。


规则阈值:自定义(绑定变量的个数)。


规则描述:绑定变量数量过多会增加变量替换时间,在一定程度上增加 sql 执行时间。


2.2 表间关联

【规则 33】


规则说明:笛卡尔积。


规则描述:缺少连接条件,导致表间关联使用了笛卡尔积的连接方式,执行计划中包含"CARTESIAN|"字样。


【规则 34】


规则说明:嵌套循环层次过深。


规则阈值:自定义(层次数)。


规则描述:嵌套循环层次过深,超过指定阀值。执行计划中嵌套多层"NESTED LOOP"或"FILTER"字样。


【规则 35】 规则说明:嵌套循环内层表访问方式为全表扫描。


规则描述:嵌套循环的内层表访问方式为全表扫描,效率很低。


【规则 36】 规则说明:排序合并连接中存在大结果集排序。


规则描述:排序合并中两个结果集都要排序,应调整为其他连接方式。


【规则 37】


规则说明:多表关联。


规则阈值:自定义(表个数)。


规则描述:过多的表关联,影响性能。


2.3 访问路径

【规则 38】


规则说明:大表全表扫描。


规则阈值:自定义(表大小,单位 GB)。


规则描述:对大表执行了全表扫描操作,执行计划中包含"TABLE ACCESS FULL"字样。


【规则 39】


规则说明:大索引全扫描。


规则阈值:自定义(索引大小,单位 GB)。


规则描述:对大索引执行了索引全扫描操作,执行计划中包含"INDEX FULL SCAN"字样。


【规则 40】


规则说明:大索引快速全扫描。


规则阈值:自定义(索引大小,单位 GB)。


规则描述:对大索引执行了索引快速全扫描操作,执行计划中包含"INDEX FAST FULL SCAN"字样。


【规则 41】


规则说明:索引跳跃扫描。


规则描述:对索引执行跳跃扫描操作,执行计划中包含"INDEX SKIP SCAN"字样。


【规则 42】


规则说明:分区全扫描。


规则描述:对分区表进行了全分区扫描,执行计划中含有“PARTITION RANGE ALL”字样。


【规则 43】


规则说明:非连续分区扫描。


规则描述:非连续分区扫描,执行计划中含有“PARTITION RANGE INLIST”或“PARTITION RANGE OR”字样。


【规则 44】


规则说明:跨分区扫描。


规则描述:连续的分区扫描,执行计划中含有“PARTITION RANGE ITERATOR”字样。


2.4 类型转换

【规则 45】


规则说明:存在隐式转换。


规则描述:在条件判断中使用了隐式数据类型转换。


2.5 其他执行计划

【规则 46】


规则说明:存在大结果集排序操作。


规则描述:可考虑通过引入索引等操作避免排序。


【规则 47】


规则说明:存在并行访问特征。


规则描述:并行很影响性能,一般情况下需要避免。


【规则 48】


规则说明:存在视图访问。 规则描述:视图操作一般可以合并、解嵌套等,如都不行应该排查视图定义。


本文转载自宜信技术学院。


原文链接:http://college.creditease.cn/detail/320


2020-02-06 21:34340

评论

发布
暂无评论
发现更多内容

双碳打开新机遇 华为互联网数据中心基础设施筑起“绿色基石”

科技热闻

缘起短视频APP系统开发介绍

工程师必知的代码重构指南

百度开发者中心

代码重构

Ipfs矿机收入如何?IPFS矿机一天收益多少?

区块链 数字货币 IPFS

「腾讯面试题」兔子试毒

Java架构师迁哥

Redis入门六:集群

打工人!

redis 缓存穿透 缓存击穿 缓存雪崩 redis集群

百度关于微前端架构EMP的探索:落地生产可用的微前端架构

百度开发者中心

百度 大前端

Bi Token质押挖矿软件系统开发方案

看CarbonData如何用四招助力Apache Spark

华为云开发者联盟

spark Apache Spark ACID CarbonData 分布式集群计算框架

腾云视界APP开发|腾云视界软件系统开发

CloudQuery 使用教程之 No.3 数据查询(中)

CloudQuery社区

云计算 dba 开发运维 数据库管控工具 国产数据控

智能技术与生物技术共同绘就生命“藏宝图”,对你我意味着什么?

脑极体

BTQQ挖矿/比特全球/BT全球系统APP开发简介

INS视频怎么保存 (2021最新图文教程)

资源君

方法 经验分享 教程 资源分享 Instagram

覆盖80%以上Java性能调优场景,三年开发经验以下慎入

Java架构师迁哥

你不知道的 Linux 使用技巧

学神来啦

Redis入门七:分布式锁

打工人!

redis 分布式锁 redis分布式锁

构筑高质量的数据中心基础设施,华为助力创造互联网全新体验

科技热闻

中国大学MOOC Android 客户端开发提效之页面信息

有道技术团队

android 服务端 客户端

革故鼎新:企业数字化转型繁荣互联网生态建设,驱动ICT设施升级

科技热闻

蜜蜂圈软件开发|蜜蜂圈APP系统开发

火艺极速版短视频系统APP开发搭建

前几年写的自己团队管理内容,如果你想做研发管理,可以看一下

安宇|Way

管理 考核 团队 文化 价值观

MongoDB磁盘清理那些事儿

循环智能

mongodb 集群 主从 GridFS 磁盘清理

提升中台化体系产研效能的ParisFlow方法与实践

downgoon

积分商城设计思考

林一

幂等性 设计实践 重试 积分商城

DOLLAR CAT/Dcat币挖矿系统开发

阿凡达公链AC系统APP开发

☕️【Java技术之旅】【ConcurrentHashMap】深入浅出核心源码分析(JDK1.8版本)

洛神灬殇

Java 源码分析 ConcurrentHashMap 6月日更

分布式图计算引擎

6979阿强

分布式计算 图计算

大佬讲【暴力破解】漏洞的原理、利用和防范

网络安全学海

网络安全 安全 信息安全 漏洞 漏洞修复

宜信的105条数据库军规(一)_新基建_韩锋_InfoQ精选文章