株式会社コーソル

コーソルDatabaseエンジニアのブログ

技術ブログ

18c新機能:スケーラブルな順序

守田です。
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)を含んでいるのが確認できます。
20180811_01.jpg

別のセッションで接続しなおし、シーケンス値をみると、セッションID(58)を含んでいるのが確認できます。
20180811_02.jpg

小ネタ:順序のリセット

18cより前のバージョンでは、シーケンスの開始点を変更するには、シーケンスを削除してから再作成するしか方法がありませんでした。
18cから、シーケンスのリセットができるようになりました。指定した値からシーケンスを再開するRESTART句を使用します。
RESTART句で指定する値は、順序のMINVALUEパラメータとMAXVALUEパラメータの値の間にする必要があります。値を指定しない場合は、MINVALUEの値が設定されます。

20180811_03.jpg

再開する値を指定する方法は、こちら。
マニュアル「SQL言語リファレンス:ALTER SEQUENCE」には記載がないのですが・・・。

20180811_04.jpg

プロフィール

On7tWW6m1Ul4

渡部 亮太

・Oracle ACE
・AWS Certified Solutions Architect - Associate
・ORACLE MASTER Platinum Oracle Database 11g, 12c 他多数

カテゴリー

アーカイブ