在表中加载大量(即填充百万行)数据时,“update seq$ set increment$=:.......”语句执行了 108,368,168 次,耗时 7,373 秒。这意味着 - 它肯定会在每次调用期间花费一些时间来获取锁存器,以便能够在需要生成一组新值时更新数据字典。
我诊断了这种情况,发现它是由于 Sequence NOCACHE 而发生的,并开始增加它的 CACHE 值,直到它不包含在 AWR 报告中由 CPU/Elepsed 排序的 SQL 中,最后当 CACHE 值设置为 100000 时它就解决了。现在有AWR 中没有与 Sequence 相关的查询,并得出结论认为 CACHE 值获得了积极的性能提升。
谁能告诉我我可以在 Oracle 中检查哪些项目以确认数据库中没有回火这么大的序列缓存。
不,它不会适得其反。如果有困惑,可以看一下手册,看看缓存的效果。这意味着您第一次从序列中选择时,它将在 sga 中缓存接下来的 999999 个值。这也意味着,对于下一个 999999 序列 nextval 调用,您将不会更新 seq$ 表。
这样做的缺点是,如果您的实例或数据库崩溃,那些缓存(和未使用)的值将丢失。因此,如果您需要没有序列丢失的序列值,这将无济于事。除了缓存,您可能还想使用 ORDER 选项来确保序列将以 ORDERED 方式分发。