技術ブログ
守田です。
18cより、「スケーラブルな順序」という機能が追加されています。
今回はこの機能についてご紹介いたします。
あるテーブルの主キー値にシーケンス(順序)が用いられており、単純に連番を付与しているとします。
このテーブルに対して大量のレコードをテーブルにINSERTすると、常に値が最後の索引リーフブロックに集中されるため、buffer busy競合が発生しやすい状況になります。
スケーラブルな順序では、シーケンス値にインスタンスIDとセッションIDを含める仕組みとなっており、結果としてセッションごとに番号を分散させることで、索引リーフブロックのbuffer busy競合を
回避できるようになっています。
スケーラブルな順序のシーケンス値 = 3桁のインスタンス・オフセット番号 || 3桁のセッション・オフセット番号 || 通常のシーケンス値 * 3桁のインスタンス・オフセット番号 = [(instance id % 100) + 100] (インスタンスIDを100で割った余りに100を足した数) * 3桁のセッション・オフセット番号 = [session id % 1000] (セッションIDを1000で割った余り)
以下、実際の環境で見ていきます。スケーラブルな順序を作成するには、SCALE句を指定します。シーケンス値をみると、セッションID(35)を含んでいるのが確認できます。
別のセッションで接続しなおし、シーケンス値をみると、セッションID(58)を含んでいるのが確認できます。
18cより前のバージョンでは、シーケンスの開始点を変更するには、シーケンスを削除してから再作成するしか方法がありませんでした。
18cから、シーケンスのリセットができるようになりました。指定した値からシーケンスを再開するRESTART句を使用します。
RESTART句で指定する値は、順序のMINVALUEパラメータとMAXVALUEパラメータの値の間にする必要があります。値を指定しない場合は、MINVALUEの値が設定されます。
再開する値を指定する方法は、こちら。
マニュアル「SQL言語リファレンス:ALTER SEQUENCE」には記載がないのですが・・・。
関連記事はありません
プロフィール
渡部 亮太
・Oracle ACE
・AWS Certified Solutions Architect - Associate
・ORACLE MASTER Platinum Oracle Database 11g, 12c 他多数
カテゴリー
アーカイブ
2024年
2023年
2022年
2021年
2020年
2019年
2018年
2017年
2016年
2015年
2014年
2013年
2012年
2000年