`
- 浏览:
48984 次
- 性别:
- 来自:
酆都
-
最近在搞一个政府项目的压力测试,200个并发访问的场景,在后台监控数据库CPU占用率老是居高不下,于是查看到底哪些执行的SQL语句占用资源大,发现这些SQL语句都有一些普遍的问题,不是没用索引就是没使用绑定变量...导致原本计划压力测试一周结束,没想到拖了差不多一个月。根据我经历,我对基于数据库的软件开发为什么如此频繁地遭遇失败有一些看法。先来澄清一下,这里提到的这些项目可能一般不算失败,但是启用和部署所需的时间比原计划多出许多,原因是需要大幅重写,重新建立体系结构,或者需要充分调优。我个人把这些延迟的项目称为“失败”,因为它们原本可以按时完成(甚至可以更快完成)。
数据库项目失败的常见的一个原因是对数据库的实际认识不足,缺乏对所用基本工具的了解。主管有意让开发人员对数据库退避三舍,甚至鼓励开发人员根本不要学习数据库!在很多情况下,开发人员没有充分利用数据库。这种方法的出现,原因可以归结为FUD[恐惧(fear)、不确定(uncertainty) 和怀疑(doubt)]。一般都认为数据库“很难”,SQL、事务和数据完整性都“很难”。所以“解决方法” 就是:不要卷入难题中,要知难而退,SQL语句完成业务逻辑就可以了,优化等到DBA去做就行了。
我一直很难理解这种数据库开发方法,原因有二:一个原因是对我来说,学习Java和C比学习数据库基本概念要难多了。现在我对Java和C已经比较熟悉,但是在能熟练使用Java和C之前我经受了许多磨炼,而掌握数据库则没有这么费劲。对于数据库,你要知道它是怎么工作的,但无需了解每一个细节。用 C或Java编程时,则确实需要掌握每一个细枝末节,而这些语言实在是“庞大”。我们开发人员Java用的这么好,没理由数据库用不好。
让我无法理解这种方法的另一个原因是,构建数据库应用时,重要的软件就是数据库。成功的开发小组都会认识到这一点,而且每个开发人员都要了解数据库,并把重点放在数据库。但我接触到的项目中,情况却几乎恰恰相反。例如,下面就是一种典型的情况:
1.在构建前端所用的GUI工具或语言(如Java)方面,开发人员得到了充分的培训。在很多情况下,他们会有数周甚至数月的培训。
2.开发人员没有进行过 Oracle 培训,也没有任何 Oracle 经验。大多数人都没有数据库经验,所 以并未理解如何使用核心的数据库构造(如各种可用的索引和表结构)。
3.开发人员力图谨守“数据库独立性”这一原则,但是出于许多原因,他们可能做不到。明显的一个原因是:他们对于数据库没有足够的了解,也不清楚这些数据库可能有什么区别。这样一个开发小组无法知道要避开数据库的哪些特性才能保证数据库独立性。
4. 开发人员遇到大量性能问题、数据完整性问题、挂起问题等(但这些应用的界面往往很漂亮)。
因为出现了无法避免的性能问题,他们把DBA找来,要求帮助解决这些难题。我知道哪些地方可能会犯错误,因为我以前就曾犯过这些错误。我总会查看是否存在下面这些问题:存在效率低下的SQL;有大量过程性代码,但这些工作原本用一条SQL语句就足够了;为了保持数据库独立性,没有用到新特性,等等。
构建数据库应用的开发人员要避开数据库的主张实在让我震惊,不过这种做法还顽固不化地存在着。 许多人还认为开发人员没办法花那么多时间来进行数据库培训,而且他们根本不需要了解数据库。为什么? 我不止一次地听到这样的说法:“Oracle是世界上可扩缩的数据库,所以我们不用了解它,它自然会按 部就班地把事情做好的。”Oracle是世界上可扩缩的数据库,这一点没错。不过,用Oracle不仅能写出 好的、可扩缩的代码,也同样能很容易地写出不好的、不可扩缩的代码(这可能更容易)。把这句话里的 “Oracle”替换为其他任何一种技术的名字,这句话仍然正确。事实是:编写表现不佳的应用往往比编写表现优秀的应用更容易。如果你不清楚自己在做什么,可能会发现你打算用世界上可扩缩的数据库建立 一个单用户系统!
数据库是一个工具;不论是什么工具,如果使用不当都会带来灾难。举个例子,你想用胡桃钳弄碎胡桃,会不会把胡桃钳当锤子一样用呢?当然这也是可以的,不过这样用胡桃钳很不合适,而且后果可能很严重,没准会重重地伤到你的手指。如果还是对你的数据库一无所知,你也会有类似的结局。正如上边的那个政府项目,开发人员正饱受性能问题之苦,看上去他们的系统中许多事务在串行进行。
举个实际的例子,项目中的一个功能需要需要修改一个表中的Falg标志字段,而这个标志字段只有2个值:Y和N。对于插入到表中的记录,该列值为N(表示未处理)。其他进程读取和处理这个记录时,就会把该列值从 N 更新为 Y。这些进程要很快地找出Flag列值为N的记录,所以开发人员知道,应该对这个列建立索引。他们在别处了解到,位图索引适用于低基数(low-cardinality)列,所谓低基数列就是指这个列只有很少的可取值,所以看上去位图索引是一个很自然的选择。
不过,所有问题的根由正是这个位图索引。采用位图索引,一个键指向多行,可能数以百计甚至更多。如果更新一个位图索引键,那么这个键指向的数百条记录会与你实际更新的那一行一同被有效地锁定。
所以,如果有人插入一条新记录(Flag列值为N),就会锁定位图索引中的N键,而这会有效地同时锁定另外数百条Flag列值为N的记录(以下记作N记录)。此时,想要读这个表并处理记录的进程就无法将N记录修改为Y记录(已处理的记录)。原因是,要想把这个列从N更新为 Y,需要锁定同一个位图索引键。实际上,想在这个表中插入新记录的其他会话也会阻塞,因为它们同样想对这个位图索引键锁定。简单地讲,开发人员实现了这样一组结构,它一次多只允许一个人插入或更新!
这里的问题就是缺乏足够的了解造成的;由于不了解数据库特性(位图索引),不清楚它做些什么以及怎么做,就导致这个数据库从一开始可扩缩性就很差。一旦找出了问题,修正起来就很容易了。处理标志列上确实要有一个索引,但不能是位图索引。这里需要一个传统的B*Tree索引。
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
* 监控数据库重要表的空间扩展情况 * 检查失效的数据库对象 * 检查无效的触发器和约束 * 数据库报错和处理情况进行汇总 1.3. 数据库定期维护内容 数据库定期维护内容包括: * 检查和处理数据表的碎片情况 * 定期...
### 数据库访问技术详解 #### 一、引言 随着信息技术的发展,数据库访问技术也在不断地演进和发展。...总之,在进行数据库应用系统设计时,了解这些技术的特点和适用场景对于做出最佳选择至关重要。
本文将深入探讨我对数据库的理解,包括其基本概念、类型、工作原理以及在实际应用中的重要性。 首先,数据库是一个有组织的数据集合,它能够提供高效的数据存储、查询、更新和管理功能。数据的组织方式多种多样,如...
理解这些启动和关闭方式对于Oracle DBA来说至关重要,因为它们直接影响到数据库的可用性、性能和安全性。例如,在维护期间,使用 `RESTRICT` 或 `NOMOUNT/MOUNT` 可以确保数据不受干扰;在遇到问题时,`FORCE` 可能...
首先,我们来谈谈数据库的基础知识。数据库是存储和管理信息的系统,它能够以结构化的方式组织数据,使得数据的检索、更新和管理变得更加高效。在本课程中,可能涉及的关系型数据模型是最常见的,其中包含关系、元组...
最后,我们来谈谈与各数据库系统的兼容性。Mysql以其开源、轻量级和高性能受到广泛应用;Oracle以其企业级的稳定性和安全性著称;DB2是IBM推出的强大数据库系统,适用于大型分布式环境;SQL Server是微软的产品,...
同时,他提到数据库管理系统(DBMS)的应用非常广泛,而维护和管理的讨论是基于其在实际网络和系统工作中的重要性。 标签中提到的“SQL 数据库”、“数据处理”、“参考文献”、“专业指导”说明了文档的涉及领域为...
首先,我们来谈谈数据库的基本概念。数据库是存储和管理数据的系统,它能够高效地组织、存储和检索数据。常见的数据库管理系统(DBMS)有MySQL、Oracle、SQL Server等。在这个资料共享系统中,数据库可能是用来存储...
以下是一些关于数据库字段设计的重要心得: 1. 数据类型选择:数据类型的选取应根据实际存储需求进行,例如,`TINYINT`类型在设置为`UNSIGNED`时,其最大值可达到255,更适合存储非负的小整数,避免存储空间的浪费...
事务处理是数据库管理中的重要概念,确保了数据库操作的原子性、一致性、隔离性和持久性(ACID特性)。例如,银行转账就是一个事务,即使在处理过程中出现故障,也能保证数据的一致性。 并发控制是大型数据库系统中...
首先,我们来谈谈数据库的基本概念。数据库是一个有组织的数据集合,它提供了数据的存储、管理、查询和更新功能。常见的数据库管理系统(DBMS)包括MySQL,它是开源且广泛使用的SQL数据库。SQL(Structured Query ...
接下来,我们谈谈数据库连接。数据库连接是指应用程序与数据库之间的通信,允许程序执行SQL语句,调用存储过程,或者获取数据。在各种编程语言中,如Java, C#, Python等,都有相应的数据库连接库,如Java的JDBC,...
首先,我们来谈谈数据库的基本概念。数据库是一个有组织的数据集合,用于存储和管理信息。在计算机科学中,最常用的数据库模型包括关系型数据库(Relational Database),例如MySQL、Oracle和SQL Server,它们基于...
总的来说,《通用数据库操作程序1.0》是一款实用性极强的数据库管理工具,它降低了数据库操作的门槛,让非专业人士也能轻松管理数据库。无论是在小型企业还是个人项目中,都能发挥其便捷高效的作用。通过使用这款...
首先,让我们谈谈DELPHI 7。这是一款由Borland公司(现为Embarcadero Technologies)开发的集成开发环境(IDE),它以其快速应用开发(RAD)而闻名。DELPHI 7支持面向对象编程,提供了丰富的组件库,如VCL(Visual ...
在IT行业中,数据库是至关重要的组成部分,特别是在网络游戏领域。标题中的“1.6数据库.zip_laborxck_架设问道_问道开服教程_问道数据库_问道端”揭示了我们正在探讨的是关于“问道”这款游戏的数据库搭建和运营教程...
最后,数据库的安全性也是重要的一环。这涉及到如何设置用户权限,防止未授权访问,以及如何通过审计跟踪数据库活动来确保数据的机密性和完整性。 通过这个“数据库系统基础内容”的课程,你将获得关于数据库核心...
首先,我们来谈谈数据库的设计。在工资管理系统中,通常会包含以下几个核心表: 1. 员工表(Employees):存储员工的基本信息,如员工ID、姓名、性别、入职日期、部门等。 2. 薪资结构表(SalaryStructures):定义...
Oracle数据库是全球广泛使用的大型关系型数据库管理系统,其在企业级应用中占据着重要的地位。本文将详细阐述Oracle数据库的安装配置过程,以及如何利用PL/SQL Developer这一强大的管理工具进行数据库管理和查询。 ...
数据库设计是IT领域中至关重要的一个环节,它关乎到数据的有效存储、管理和检索。ER模型,全称为实体-关系模型,是数据库设计中用于概念建模的一种方法,它以直观的方式来描述现实世界中的数据和它们之间的关系。在...