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

CLOBでのSUBSTRのパフォーマンス

    (うそ、くそー 嘘、そしてベンチマーク...)

    テストを10回再実行し、文字列を拡張して30文字の長さにしたところ、次の平均結果が得られました。

    +000000000 00:00:00.011694200 (VARCHAR2)
    +000000000 00:00:00.901000600 (CLOB SUBSTR)
    +000000000 00:00:00.013169200 (DBMS_LOB.SUBSTR)
    

    次に、部分文字列の範囲を5,14(DBMS_LOB.SUBSTRの場合は14,5)に変更し、次のようになりました。

    +000000000 00:00:00.011731000 (VARCHAR2)
    +000000000 00:00:01.010840000 (CLOB SUBSTR)
    +000000000 00:00:00.011427000 (DBMS_LOB.SUBSTR)
    

    次に、範囲を17,14(DBMS_LOB.SUBSTRの場合は14,17)に変更し、取得しました

    +000000000 00:00:00.013578900 (VARCHAR2)
    +000000000 00:00:00.964527400 (CLOB SUBSTR)
    +000000000 00:00:00.011416800 (DBMS_LOB.SUBSTR)
    

    最後に、範囲を25,14(DBMS_LOB.SUBSTRの場合は14,25)に変更し、取得しました

    +000000000 00:00:00.011210200 (VARCHAR2)
    +000000000 00:00:00.916439800 (CLOB SUBSTR)
    +000000000 00:00:00.013781300 (DBMS_LOB.SUBSTR)
    

    私の結論は、CLOBに対して作業する場合は、「通常の」VARCHAR2に対してSUBSTRを使用する場合と比較して、パフォーマンスの低下が事実上ないように見えるため、DBMS_LOB.SUBSTRを使用するのが最善であるということです。 CLOBに対するSUBSTRは、パフォーマンスが大幅に低下するようです。記録のために-OS=HP / UX(Unixバリアント)、Oracleバージョン=11.1、プロセッサ=HPItanium2-plex。 YMMV。

    共有してお楽しみください。

    また、やり直す価値がある場合は、やりすぎる価値があるため、文字列を32767文字に拡張した結果をさらにいくつか示します。結果の各セットで指定される部分文字列の範囲:

    1, 25000
    +000000000 00:00:00.198466400 (VARCHAR2)
    +000000000 00:00:02.870958700 (CLOB SUBSTR)
    +000000000 00:00:00.174490100 (DBMS_LOB.SUBSTR)
    
    1000, 25000
    +000000000 00:00:00.253447900 (VARCHAR2)
    +000000000 00:00:02.491790500 (CLOB SUBSTR)
    +000000000 00:00:00.193560100 (DBMS_LOB.SUBSTR)
    
    10000, 25000
    +000000000 00:00:00.217812000 (VARCHAR2)
    +000000000 00:00:02.268794800 (CLOB SUBSTR)
    +000000000 00:00:00.222200200 (DBMS_LOB.SUBSTR)
    

    同じ日、同じ結論。

    クトゥルフfhtagn。

    (もう一度違反に、親愛なる友人、もう一度...)

    ベンチマークを再実行し、CLOBのサイズを3276700に変更し、中央から2475000から始まるサブストリングを長さ25000で取得します。

    +000000000 00:00:00.176883200 (VARCHAR2)
    +000000000 00:00:02.069482600 (CLOB SUBSTR)
    +000000000 00:00:00.175341500 (DBMS_LOB.SUBSTR)
    

    (変更は最後の2つのテストにのみ影響することに注意してください)。

    そして...同じ結果、異なる日。

    YMMV。



    1. SQL ServerIntegrationServicesを使用したOracleデータベースへの接続

    2. 長い単一のSQLiteOpenHelperを、テーブルごとに1つずつ、複数のクラスに分割するにはどうすればよいですか。

    3. Oracle列の自動変更タイムスタンプタイプはありますか?

    4. SQL ServerでのCOT()の例