我有各种使用序列的数据库应用程序,我将这些应用程序从不带RAC的10g迁移到具有RAC的11g的Oracle RAC.我需要有序的序列和间隙是容忍的.
我正在考虑缓存顺序,我不知道在性能上有什么影响.你认为这是一个很好的选择吗?您对序列和RAC有什么经验?
谢谢,
解决方法
在这个上下文中,“有序”是什么意思?
默认情况下,群集中的每个节点都有单独的序列号高速缓存.因此,节点1可以递送值1-100,而节点2递送值101-200.从单个节点返回的值是顺序的,但是节点1上的会话A可能获得值15,而节点2上的会话B获取值107,因此跨会话返回的值显示为无序.
如果您指定序列必须被排序,那么您基本上就是击败了序列缓存的目的,因为Oracle每次请求一个新的序列值时都必须在节点之间进行通信.这有可能创造出相当多的性能开销.如果你使用这个序列作为一个时间戳,这个开销可能是必要的,但并不是一般的期望值.
在实践中的开销差异将依赖于高度的应用程序 – 对于某些应用程序来说,这是不可估量的,对其他应用程序来说是一个重大的问题. RAC节点的数量,互连的速度以及互连流量有多少也有所贡献.而且由于这主要是一个可伸缩性的问题,实际的效果将会限制您的应用程序如何扩展,这本质上是非线性的.将应用程序处理的事务量加倍将远远超过开销的两倍.
如果指定NOCACHE,则ORDER或NOORDER的选择基本上是不相干的.如果指定ORDER,则CACHE或NOCACHE的选择基本上是无关紧要的.所以CACHE NOORDER是迄今为止最有效率的,其他三个是相对可互换的.每次请求序列值显然是潜在的瓶颈时,它们都将涉及节点间协调和网络流量.
通常最好将TIMESTAMP列添加到表中以存储实际的时间戳,而不是依赖序列来提供时间戳顺序.