您将要进行3种类型的调整,其中1种是被动调整,而2种是主动调整。
反应性
突然,一些查询开始引起您的问题。可能是由于应用程序错误或功能,表增长超出预期,流量高峰或查询优化器变得“创意”。这可能是午夜时分,现场的糟糕事件,或者可能是由于系统响应速度缓慢而引起的。无论哪种方式,反应性调整的定义特征是您已经遇到了问题。不用说,您想要做的越少越好。这带我们去...
积极主动
类型1:例行维护
按照某种时间表,每隔几个月或几周,这取决于架构更改的频率和数据增长的速度,您应该查看数据库性能分析工具的输出(例如,针对Oracle DBA的AWR报告)。您正在寻找初期问题,这些问题正在要求进行响应式调整,以及低落的成果,这些项目不太可能很快引起问题,但可以通过很少的努力加以改进,以期避免出现严重问题。 -未来的问题。您应该花多少时间取决于您有多少时间以及可能要花费的时间,但是最佳金额永远不会为零。但是,您可以通过执行以下操作轻松减少需要花费的金额:
类型2:适当的设计
克努斯(Knuth)反对“过早优化”的告诫广为人知,并得到应有的尊重。但是必须使用“过早”的正确定义。一些应用程序开发人员在被允许编写自己的查询时,倾向于采用他们遇到的第一个查询,这在逻辑上是正确的,并且不关心性能,当前或将来。或者他们可能会针对根本不能代表生产环境的开发数据集进行测试(提示:请勿这样做!开发人员应始终可以访问实际数据进行测试。)。关键是,调整查询的正确时间是第一次部署查询时,而不是在性能不佳的SQL列表中显示查询时,而不是在导致严重问题时才进行调整。
那么,什么可以作为DBA领域中的过早优化呢?在我的清单中,最重要的是无需证明需要就可以标准化。当然,您可以在父行中维护总和,而不是在运行时从子行中计算总和,但是您真的需要吗?如果您是Twitter或Amazon,战略性反规范化和预先计算可能是您最好的朋友。如果您要为5个用户设计一个小型记帐数据库,则必须优先考虑适当的结构以促进数据完整性。其他过早的优化同样是优先事项。即使您认为您可以将查询的时间缩短到0.1秒,也不必花费数小时来调整每天运行一次且耗时10秒的查询。也许您有一个每天运行6个小时的报告,但在投入时间进行调整之前,请探索将其作为批处理作业进行计划。如果您的生产负载永远不会超过10%(假设您可以管理安全性),则不要投资单独的实时复制报表实例。
通过针对实际数据进行测试,对增长和流量模式进行有根据的猜测(加上峰值的余量),并运用您对平台优化程序怪癖的知识,您可以部署不仅在现在而且在将来以最佳状态运行的查询,并且条件不理想。当您应用适当的技术时,可以准确地预测和优化查询性能(就每个组件而言,其速度应与所需的一样快)。
(同时,您还可以学习统计信息!)