sql >> データベース >  >> RDS >> Oracle

Oracleの既知のパーティションキー値を前提として、行がどのパーティションに入るのかを判断するにはどうすればよいですか?

    このテストデータで

    INSERT INTO foos VALUES (1234, SYSDATE);
    INSERT INTO foos VALUES (1235, SYSDATE);
    INSERT INTO foos VALUES (1236, SYSDATE);
    

    ここで説明されているように、 https://jonathanlewis.wordpress.com/2009/11 / 21 / ora_hash-function /

    あなたが得る

    with hsh as (
    select  BATCH_ID, ora_hash(BATCH_ID, 3)+1 subpartition_position  from foos)
    select BATCH_ID, SUBPARTITION_POSITION,
    (select subpartition_name from   user_tab_subpartitions where   table_name = 'FOOS' and SUBPARTITION_POSITION = hsh.SUBPARTITION_POSITION) subpartition_name
    from hsh;
    
      BATCH_ID SUBPARTITION_POSITION SUBPARTITION_NAME            
    ---------- --------------------- ------------------------------
          1236                     1 R0_H0                          
          1235                     3 R0_H2                          
          1234                     4 R0_H3   
    

    パラメータ3に注意してください ora_hashで (サブ)パーティションの数から1を引いたものです(=4-1)。リファレンスで説明されているように、パーティションの数が2の累乗でない場合(推奨されません)、追加の処理を行う必要があります。

    以下のように、明示的なパーティションクエリを使用して結果を確認できます

    select * from foos subpartition( R0_H0 ); --   1236
    select * from foos subpartition( R0_H1 ); --   empty
    select * from foos subpartition( R0_H2 ); --   1235
    select * from foos subpartition( R0_H3 ); --   1234
    

    そしてもちろん、 1237の新しい新しいキーでも機能します これは表にありません。

    with hsh as (
    select  1237 BATCH_ID, ora_hash(1237, 3)+1 subpartition_position  from dual)
    select BATCH_ID, SUBPARTITION_POSITION,
    (select subpartition_name from   user_tab_subpartitions where   table_name = 'FOOS' and SUBPARTITION_POSITION = hsh.SUBPARTITION_POSITION) subpartition_name
    from hsh;
    
      BATCH_ID SUBPARTITION_POSITION SUBPARTITION_NAME            
    ---------- --------------------- ------------------------------
          1237                     2 R0_H1 
    

    「予測される」サブパーティションはR0_H1です。 、INSERTがどこに行くか見てみましょう:

    INSERT INTO foos VALUES (1237, SYSDATE);      
    select * from foos subpartition( R0_H1 ); --  1237
    

    ただし、IMOで文書化されていない機能であるため、注意して使用してください...




    1. データベーステストとは何ですか?それを実行する方法は?

    2. 新しいSQLServerカーディナリティ推定器の最初の外観

    3. SQL ServerのFILE_ID()とFILE_IDEX()の違い:違いは何ですか?

    4. Hibernate-1に対して2つの列を結合する方法はありますか?