可以改进分段存储以实现在决策支持和 OLTP 查询方面的优化性能。
以下建议是对表和索引进行分段的准则:
- 要实现决策支持查询方面的最优性能,应对表进行分段,以
提高并行性,但不要对索引进行分段。
拆离索引,并将它们放入单独的数据库空间。
- 要实现 OLTP 查询方面的最佳性能,请使用分段索引以减少会话之间的争用。通常您可以按键值对索引进行分段,这意味着 OLTP 查询只需查看一个分段就可以找到行的位置。
如果键值不减少争用,如每个用户查看同一组键值(例如:日期范围)时,那么您可以考虑 WHERE 子句中使用的其他值对索引进行分段。要减少分段管理,可以考虑不对某些索引进行分段,尤其是您无法找到一个好的分段存储表达式来减少争用时。
- 如果决策支持查询顺序读取表,那么可以对数据使用循环分段存储。如果表中的所有列都不能使用基于表达式的分段存储方案,那么对于在多个磁盘间平均地分布数据而言,循环分段存储不失为一个好方法。但是,在大多数
DSS 查询中读取所有的分段。
- 要减少所需数据库空间的总数和搜索所需的时间,可在相同的数据库空间中存储多个指定分段。
- 如果您正在使用表达式,应创建它们,这样在磁盘之间平衡的是 I/O 查询而不是数据的数量。例如:如果大多数查询
只访问表中的一部分数据,那么应设置分段存储表达式在磁盘间散布表的活动部分,即使这样会导致行分布的不是很均匀。
- 使分段存储表达式保持简单。您想要分段存储表达式有多复杂,它们就可以有多复杂。
然而,计算复杂的表达式会花费更多的时间,并有可能导致无法从查询中消除分段。
- 合理排列分段存储表达式,以便可以首先在表达式中测试每个数据库空间的最具限制性的条件。
当数据库服务器为一个给定分段按照标准测试一个值时,只要该分段的任何一个条件的结果为假,测试就会停止。
这样,如果将最有可能为假的条件放在最前面,那么在数据库服务器转到下一个分段前,需要求值的条件就会减少。
例如:在下面的表达式中,当尝试插入一个值为 25 的行时,数据库服务器会
测试所有 6 个不等式条件:
x >= 1 and x <= 10 in dbspace1,
x > 10 and x <= 20 in dbspace2,
x > 20 and x <= 30 in dbspace3
通过比较,以下表达式中只有 4 个条件需要测试:dbspace1 的第一个不等式条件 (x <= 10)、dbspace2 的第一个条件 (x <= 20),以及 dbspace3 的两个条件:
x <= 10 and x >= 1 in dbspace1,
x <= 20 and x > 10 in dbspace2,
x <= 30 and x > 20 in dbspace3
- 应避免使用任何需要数据类型转换的表达式。类型转换会增加计算表达式所花费的时间。
例如,为便于比较,DATE 数据类型将隐式转换为 INTEGER。
- 除非您不介意增加管理成本,否则请不要对经常改变的列进行分段。
例如:如果对日期列进行分段,并且删除较旧的行,那么具有最早日期的分段就可能清空,而具有最近日期的分段有可能填满。
最终,您必须删除旧的分段,并为更新的订单添加新的分段。
- 不要对每个表均进行分段。应标识出访问最频繁的那些关键表。
在一个磁盘上,只放置一个表的一个分段。
- 不要对小的表进行分段。在许多磁盘上将一个小表进行分段,可能根本不值启动所有扫描线程来访问这些分段的开销。
同样,应该根据系统中处理器的数量平衡分段的数量。
- 当您在未分段表上定义一个分段存储策略时,应检查下一扩展数据块大小,以确保未给每个分段分配大量的磁盘空间。