Oracle 和 DB2,比较和兼容性/存储模型/索引/总结
关系理论指出,数据的物理组织不应该有任何性能限制。这是在一个理想的世界中,数据库的实际世界实现作为同时存在于磁盘和内存中的结构意味着,合并在一起的数据将更快地返回。这种合并被称为集群。由于数据之间的关系(以及因此进行集群)是由您的应用程序需求决定的,这种结构似乎更像是逻辑约束。在现实中,它有一个物理含义,即物理分组在一起的数据(无论是在磁盘上还是在 RAM 中)都可以更快地访问,因为单个块获取可以返回大量所需数据(与从不同物理位置获取相同数据的大量昂贵的 I/O 请求相反)。使用集群技术时需要考虑的是,如果您的应用程序正在执行随机数据的单例选择,那么任何数量的集群都无济于事。对于需要返回大量相关数据的应用程序,集群将有所帮助,但是有一个操作开销,因为数据需要按特定顺序存储,并且维护此顺序需要付出努力。
集群是一种通过将常用的数据放在同一个块中来组织数据的技术。到目前为止,数据库操作中最大的单个开销是物理 I/O。通过将频繁访问的在一起的数据组织成集群,可以一次块获取访问大量相关数据。集群数据的一种方法是通过索引。数据可以通过以下方式进行集群
• CTAS/CTAL。
在 Oracle 中,使用 ORDER BY 子句的 Create Table As Select (CTAS) 将执行全表扫描。在 DB2 中,您可以使用 Create Table As Select 或 Create Table As LIKE。当所有行都被收集后,它们将在临时表空间(Oracle 的 PSATEMP 和 DB2 的 TEMPSPACE1)中排序,然后再填充新表。数据根据 ORDER BY 子句中指定的列的值进行组织。这需要您手动重新组织表,以便相关的表行存储在相邻块中。
这种技术最适合大多数 SQL 查询遍历非集群一对多数据的数据库。这方面的一个好例子是 BOM(物料清单)结构,它反映了客户的所有订单,订单的所有行项目,甚至账单周期内信用卡对账单的所有费用。在这种情况下,订单上的行项目(例如)被重新排序到相邻数据块中。
行重新排序可以通过以下方式提供帮助
将相关的行聚集在一起到同一个数据块中,将数据组织起来以避免检索后进行磁盘排序。将相邻行打包到单个数据块中以减少索引行扫描的块获取。
行重新排序对执行全表扫描或索引唯一扫描的查询没有帮助。这意味着,对于大多数表来说,物理重新排序行并不会对 SQL 响应时间产生显著影响,因此了解将要对数据运行的查询类型非常重要。
• 索引集群表
重新排序表数据的另一种机制是使用索引。表集群是一组共享公共列的表。由于它们共享公共列,因此它们也共享相同的数据块,因此它们经常一起使用。当您创建集群表时,每个表的行都存储在相同的数据块中。
索引集群表可以是多表或单表。
• 单表索引集群表
在单表索引集群表中,Oracle 通过使用近似于块大小的集群因子来保证行顺序。表的行根据索引列中的值按顺序排列在数据块中。因此,索引范围扫描将始终在一个 I/O 中获取尽可能多的行。
虽然这对于检索数据是最佳的,但需要有一种机制来处理将新数据插入没有目标块空间的表中。Oracle 使用溢出区来处理这种情况,并且维护溢出区非常重要。您必须定期重新组织单表索引集群表,以确保所有行顺序都得到维护。
• 多表索引集群表
在多表索引集群中,相关的表行被分组在一起以减少磁盘 I/O。这类似于单表索引集群,不同之处在于现在来自多个表的相关数据一起存储。使用上面的 BOM 示例,多表索引集群将具有与客户订单相关联的所有行项目行,这些行项目行与客户订单存储在同一个块中。这样一来,您就不需要获取客户订单,然后对与该订单相关的行项目进行单独获取,而只需要进行一次块获取,就可以在一次操作中获取所有所需数据。
只有当应用程序所需的大部分数据都是通过集群索引访问时,索引集群才会减少 I/O。如果您使用可能在该数据上定义的任何其他索引,您将获得随机块获取。
• 排序哈希集群。
从 10g 开始,Oracle 可以使用数学索引函数(称为哈希函数)将相关数据放置在相邻块中。根据 Oracle 文档
"在排序哈希集群中,对应于每个哈希函数值的行按指定的列集升序排序,这可以提高对集群数据的后续操作的响应时间。"
用英语来说,这意味着哈希集群允许您检索数据,而无需搜索索引的开销。哈希的目标是为每个唯一的列值生成唯一的地址。地址的值由数学表达式生成,并且已经发现不可能保证这些地址是唯一的。这是一个微不足道的问题,它会导致冲突,即计算出一个地址,结果发现该地址已被使用。由于以这种方式访问数据非常快,因此使用这种技术有优点。这些优势伴随着权衡,因为当发生冲突时,您最终可能会遇到块溢出和链接(写入数据的开销),以及读取数据的开销,因为可能需要读取多个块才能获取所需的数据。因此,排序哈希集群最适合在处理非常大的数据集时,这些数据集相对稳定,并且主要通过对哈希键进行等值查询来访问。您还需要真正了解您的数据,因为您必须预先指定哈希键的数量和每个键的存储量,并且必须具有唯一且均匀分布的集群键值。
排序哈希集群非常快,就像任何快速的东西一样,您需要有特定的需求来执行它,并了解其后果。
集群是数据库性能中一个非常重要的概念,它直接影响数据在数据块中的布局。