Oracle 12c 有一个选项可以将旧数据归档在同一个表中,而无需创建新表 -在数据库归档中。它很容易使用,但我对性能和索引有疑问。
索引如何工作,尤其是唯一索引?
是否可以将这样的值添加到应该是唯一的列中?
例如,归档具有唯一1列值的记录。col NUMBER如果添加带有 的记录会发生什么情况,是否col = 1会考虑归档数据?如果是,那么归档对提高性能没有多大帮助,如果不是,那么当从所有数据中进行选择时 ( visibility = all),就会违反字段的唯一性。
它是怎么运行的?
关于12.1 文档中新的In Database Archiving选项:
您可以在表本身中存储更长时间的更多数据,而不会降低查询性能。
请注意,文档中没有提到性能改进。
为此,将在表中创建一个隐藏字符列(此版本中还引入了隐藏列) ,
ORA_ARCHIVE_STATE默认值为'0'=active,可以将其设置'1'=archived为使该条目对查询不可见,而无需在查询条件本身中明确指定它.换句话说,对归档记录的过滤本质上是一个正常的谓词,将在执行查询时隐式添加,您不应该期望优化器在读取时“神奇地”绕过归档记录。归档记录不会以任何方式影响索引。
为了确认上述内容,让我们看一个可重现的示例:
虽然没有收集统计信息,但优化器认为查询将返回 100K 记录:
收集统计数据后,将包括归档记录:
现在优化器知道查询将只返回一条记录,但这并没有使选择更有效 - 仍然是全表扫描: