在数据库设计的初始阶段,一个核心任务便是明确数据库的种类。我们一般将业务划分为两大类:在线事务处理系统(OLTP)和在线分析系统(OLAP)。这两种系统在数据库设计上的差异显著,甚至在某些方面呈现出相反的设计理念。例如,OLTP系统侧重于数据库的内存效率,关注内存指标的高命中率,以及绑定变量和并发操作的重要性。相对地,OLAP系统则更注重数据分析,关注SQL执行时间,磁盘I/O性能以及分区技术。由于这些差异,在数据库设计阶段,明确数据库类型显得尤为关键。只有在明确了这一点的基础上,我们才能进一步探讨数据库的具体设计细节。否则,缺乏这一前提的设计将是盲目无序的 OLTP 在线事务处理系统
OLAP与OLTP是两种本质不同的系统,它们对数据库的需求也大相径庭。一般来说,OLTP系统面临的用户并发数量众多,但这些用户对数据库的操作通常较为简单,因此数据库的核心性能要求是能够迅速响应用户操作。例如,12306就是一个典型的OLTP系统。
在OLTP系统中,数据库的内存设计尤为关键。如果数据能够在内存中高效处理,那么数据库的整体性能将显著提升。内存设计的优化通常涉及对Oracle数据库与内存相关的初始化参数进行调整,其中几个关键参数包括SGA的大小(如数据缓冲区、共享池)和PGA的大小(如排序区、哈希区等)。这些参数在OLTP系统中扮演着至关重要的角色,因为OLTP系统中的数据块变化频繁,SQL语句提交也非常频繁。为了提升性能,应尽可能将数据块保留在内存中,并尽可能使用变量绑定技术来重用SQL,减少物理I/O和避免重复的SQL解析。
关于初始化参数的设置,没有一成不变的准则,这需要根据每个数据库上运行的特定业务来确定。确定这些参数最佳值的唯一途径是通过测试。可以先根据经验设定这些参数的初始值,然后通过建立测试环境对数据库进行测试。利用AWR性能报告,不断调整这些参数,以实现最优的性能表现。 OLAP 在线分析系统
一般来说,用户对OLAP系统性能的期望通常不像对OLTP系统那样严苛,或者说用户对OLAP系统的性能问题更具容忍度。在OLAP系统中,SQL语句的优化至关重要。当表中的数据量仅为几千条时,无论是执行全表扫描还是使用索引,性能差异可能并不明显。然而,当数据量增长到数亿甚至更多时,全表扫描与索引选择之间的性能差异就会变得非常显著。
在OLAP数据库中,分区技术扮演着重要角色,其重要性主要体现在数据管理方面。例如,数据加载可以通过分区交换来实现,备份可以通过备份分区表空间来完成,删除数据也可以通过分区操作来实现。在OLAP环境中,分区的主要优势在于管理的便捷性,它并不总是能保证查询性能的提升。有时分区可以提高性能,有时则可能降低性能。
当查询操作需要跨越多个分区时,分区可能并非最佳选择。因为分区索引在执行FFS(INDEX FAST FULL SCAN)时只能在本地索引上进行,如果查询涉及到其他分区,还需要按照访问索引的方式去访问其他分区的索引(例如,先找到其他分区索引的根数据块,再找到最左边的叶块,然后执行FFS操作)。这样,查询跨越的分区越多,额外的性能开销就越大。相比之下,全局索引只需定位到一个叶块,然后执行一次FFS就能扫描所有索引叶块,因此在某些情况下,全局索引的性能可能会优于分区索引。
