- CYBER SECURITY)による"Prevent a weak cloud security posture with Maximum clob型には巨大なサイズの値が入っていることがありますので、桁あふれにはご注意ください。 最大桁数を指定して取得したい場合は以下記事をご覧ください。 → [oracle] clob型をサイズを指定して文字型に変換する(dbms_lob.substr) Oracle11gからのパフォーマンス向上(圧縮など)のために、再設計された新しいLOBデータ型です。詳細は「2.LOBデータ型」を参照してください。, (4)圧縮アドバイザ SECUREFILEでは、BASICFILEから以下のように変更されています。また、UNDOデータはすべてRETENTIONになります。つまり、自動UNDO管理モードでないと使用できません。, 圧縮機能と重複除外機能は、以下のようになります(ただし、Advanced Compressionオプションが必要です)。暗号化については別の機会に説明しようと思います。, 3. dbms_lob.substrで指定するサイズはバイト数ではなく文字数なので、全角文字を扱う場合は桁あふれにご注意ください。 単にclob型を文字列に変換したいだけの場合はto_char関数が使えます。 関連項目 [oracle] clob型を文字型に変換する Oracleデータベースには、表圧縮機能といってもいくつか存在しますので、少し整理してみました。最初に、Oracle9iR2からダイレクト・ロード操作だけで圧縮することができるデータ・セグメント圧縮が提供されました。次に、Oracle Database 11g(Oracle11g)ですべてのSQLで圧縮することが可能なOLTP表圧縮が提供されました(このときデータ・セグメント圧縮から基本表圧縮に変更になっています)。同時に、LOBデータ型に対して圧縮することが可能なSecureFiles機能も提供されています。これをまとめると以下のようになります。, OLTP表圧縮とLOB圧縮は、Advanced Compressionオプションが必要です。ウェアハウス圧縮とアーカイブ圧縮は、EHCC(Exadata Hybrid Columnar Compression)機能ですので、Exadataだけで使用することが可能ですが、表圧縮機能の比較として載せています。, (1)基本表圧縮とOLTP表圧縮の違い ③ LOBセグメントを拡張します。, このLOB索引は、チャンク・サイズが適切でないと増加してしまうため、未使用領域の検索時にアクセス数も増えてしまいます(チャンク・サイズのデフォルトは、Oracleブロックの1ブロック・サイズです)。そのため、LOBデータのサイズとチャンク・サイズを同じにするように指定します(Oracleブロック・サイズの整数倍で指定する必要があります)。ただし、LOBデータのサイズが常に同じとは限りませんので、設定するのが簡単ではありません。LOB索引名やチャンク・サイズなどは以下のようにして確認できます。, (2)SECUREFILE LOB ILMという機能がOracleデータベースにある訳ではありません。これは、情報のライフサイクル(生成されてから必要なくなるまでの流れを表すもの)に対する一般的なソリューションです。すべてのデータのアクセス頻度が同じではないことを利用して、リソースや機能を効果的に管理しましょうというものです。特に大容量データを効果的に管理するには、ディスク容量や性能については大きな問題になります。このILMソリューションをOracleデータベースで実現すると、以下のように時系列のパーティションや表圧縮機能などを使用して実現することが一般的です(パーティションを使用するのは、1つのテーブル内でも管理する必要があるからです)。, このようにパーティション化して、UPDATEしなくなったら(またはUPDATEが少なくなったら)圧縮するためにMOVEパーティションを行います(このときに、性能の異なるディスクに移動なども行う)。現在はこれを自動で行うことはできませんので、運用が複雑になるからと嫌う方もいると思いますが、ディスク容量や性能が不足してくると、ディスク追加などを行っているのと同じことです(圧縮することによって、追加するディスクを削減することも可能です)。, 2. 基本表圧縮は、ダイレクト・インサート操作(第15回で説明したダイレクト・パス・インサート、テーブル/パーティションのMOVE操作など)だけで圧縮することができる機能です。それに対してOLTP表圧縮は、ダイレクト・インサート操作以外のSQLでも圧縮するようになっています(ただし、列数の最大が255個までの制限があります)。OLTP表圧縮は、通常のSQLでも圧縮を行いますが、SQL文ごとにデータ圧縮が動作するのではなく、Oracleブロックの領域使用率が閾値(PCTFREEを基に計算された閾値)を超えたとき、Oracleブロック内のデータを圧縮します。指定はOracle11gR2から以下のように変更されています(デフォルトは基本表圧縮”BASIC”です)。, ILMなどで必要なときに圧縮する場合は、基本表圧縮(MOVE操作など)で問題ありません。また、初期ロード(ダイレクト・ロードなど)で圧縮する場合も基本表圧縮で問題ありません。ただし、通常のINSERT文で大量に挿入するような場合は、OLTP圧縮を使用する必要があります。ETLツールなどでは、ダイレクト操作を行わない(PL/SQLなどで行う)ものがありますので、その場合もOLTP圧縮が必要になりますので注意してください。, (2)ウェアハウス圧縮とアーカイブ圧縮 初期のOracle Databaseリリースでは、LOB記憶域タイプのみサポートされていました。Oracle Database 11 g でSecureFiles LOB記憶域が実装され、元の記憶域タイプの名前がBasicFiles LOB記憶域となり、これがデフォルトになりました。. LOBデータ型 LENGTH()とDBMS_LOB.getLength()は両方ともCLOBで使用される文字数を返しますが、使用されているバイト数を知る必要があります(マルチバイト文字セットを扱っています)。, コメントを回答として追加します。これは、受け入れられた回答よりも幅広いケースで元の問題を解決するためです。注:データに含まれるマルチバイト文字の最大長とおおよその割合を把握する必要があります。, 4000バイトを超えるCLOBがある場合、SUBSTRではなくDBMS_LOB.SUBSTRを使用する必要があります。 amountおよびoffsetパラメーターは、 DBMS_LOB.SUBSTR。, 次に、このパラメーターはcharactersの数であり、マルチバイト文字がある場合は4000であるため、4000未満のサブストリングが必要になる場合があります文字は4000bytesを超える長さになり、ORA-06502: PL/SQL: numeric or value error: character string buffer too smallは、サブストリングの結果が4000バイト制限のVARCHAR2に収まる必要があるためです。正確に取得できる文字数は、データ内の文字ごとの平均バイト数によって異なります。, 最長のCLOBをカバーするために必要な数のチャンクを追加し、データの文字あたりの平均バイト数に従ってチャンクサイズを調整します。, CLOBを「VARCHAR2互換」サイズの部分に分割し、CLOBデータのすべての部分でlengthbを実行し、すべての結果を要約する必要があります。, 簡単な解決策は、CLOBをBLOBにキャストしてから、BLOBの長さを要求することです!, 問題は、OracleにはCLOBをBLOBにキャストする関数がありませんが、それを行う関数を簡単に定義できることです。, Unicode(UTF-8)を使用せずにOracle 10gでこれをテストしました。しかし、Unicode(UTF-8)Oracleインスタンスを使用すると、このソリューションは正しいに違いないと思います:-), Clobをblobに変換するソリューションを投稿したNashevに感謝します OracleでCLOBをBLOBに変換する方法 と、ドイツ語で書かれたこの投稿(コードはPL/SQLにあります) 13ter.info.blog それはさらにblobをclobに変換する関数を与えます!, 誰かがUnicode(UTF-8)CLOBで2つのコマンドをテストできるので、これはUnicodeで動作することを確信していますか?, 次に、セグメント名を使用して、dba_segmentsで使用されているバイトを見つけます。, Content dated before 2011-04-08 (UTC) is licensed under. Q Oracleのテーブルサイズ. 今回は表圧縮とLOBデータ型について説明しました。また機会があれば他のことについても説明しようと思います。これからも頑張りますのでよろしくお願いします。質問をお待ちしています。 それでは、次回まで、ごきげんよう。. 今回は、第13回で説明した表圧縮の続きとLOB(Large OBject)データ型について説明しようと思います。これまでいろいろと圧縮機能について説明してきましたが、非常に便利な機能ですが万能ではないことを認識して欲しいと思い、少しまとめてみましたので、参考にしてください。, 1. CLOBはシングルバイトまたはマルチバイト・キャラクタ・データを扱うデータ型です。 Exadataだけで使用できるHybrid Columnar Compression(HCC)機能で、基本表圧縮より圧縮効率の高い圧縮機能になります(Oracleブロック内に異なる方法で格納します)。これもダイレクト・インサート操作だけで圧縮されますが、これを使用できるのもExadataを使用するメリットになります。ウェアハウス圧縮は、検索性能を重視した圧縮タイプで、DWHアプリケーション向けです。アーカイブ圧縮は、記憶域の削減を重視した圧縮タイプで、履歴データなどの変更されないデータ向けです。どちらのタイプも”HIGH”の方が圧縮率が高いですが、圧縮および検索時のCPUオーバーヘッドも高くなります。検索するようなデータでは、基本は”QUERY HIGH”で問題ないと思います。UPDATE文などの非ダイレクト操作を行うと、対象のOracleブロックがOLTP表圧縮になります(このとき多少オーバーヘッドが発生します)。指定するには以下のように行います。, (3)LOB圧縮(SecureFiles) 行移行が発生したテーブルに対してアクセス効率を向上させるには、テーブル(またはパーティション)の再構築が必要になります。そのため、UPDATEが多いテーブル(またはパーティション)は圧縮しないようにすることが最適になります。ただし、そうすると圧縮できるテーブルが少なくなってしまいますので、ILMなどのテーブル内でのアクセス頻度の違いを利用して、パーティション化することを検討してください。パーティション化することで、UPDATEが多いテーブルのOracleブロック利用効率を向上することが可能です(圧縮を使用しない場合でも効果があります)。これは、パーティション単位にPCTFREEを指定することにより、効果的に使用できるからです(以下が指定例です)。, (6)ILM(Information Lifecycle Management)について 最近は、非構造化データを使用するようなシステムが増えてきましたので、そのようなデータを扱うLOBデータ型(LOB)についても重要なってきています(LOBを使用することで、構造化データと同じように扱うことができます)。LOBは、第25回で説明したSQLオブジェクト型やXMLDBなどでも内部的に使用しています。LOBは、通常のセグメントとは異なる管理を行いますので、同じように使用しても性能が出ませんので注意が必要です。データサイズが4000(正確には3964、後から説明するSECUREFILEは3968)バイトを超えると(または”disable storage in row”を指定すると)、以下のように行外データとして別セグメント(LOBセグメント)に格納します(デフォルトは表セグメントと同じ表領域に格納します)。ただし、行内データは表セグメントのOracleブロック数を増加させますので、LOBデータ以外へのアクセス性能が低下します。つまり、LOBデータに頻繁にアクセスしないシステムでは、効率良くないので注意してください。, LOBセグメントを使用する場合は、UNDOセグメントを使用しなくなりますので、ロールバックするためのBeforeイメージ(UNDOデータ)をLOBセグメントに格納します。このとき、NOCACHEモードの場合、INSERT/UPDATE文はダイレクト操作になります(NOLOGGINGモードの場合はREDOログも生成されません)。そのときのUNDOデータの上書きの制御を以下の二つの方法(領域サイズベース、保持期間ベース)で行います。, Oracle 11gからは、BASICFILE LOB(BASICFILE)とSECUREFILE LOB(SECUREFILE)があります(BASICFILEは以前からのLOBです)。SECUREFILEの方がより多くの機能がありますので(性能も改善されていますので)、できるだけSECEREFILEを使用してください。どちらを使用するかは、以下のようにLOB STORAGE句で指定します(初期化パラメータDB_SERCUREFILEで、何も指定しないときのデフォルト値を指定できます。LOB STORAGE句に何も指定しない場合のデフォルトはBASICFILEです)。, LOBは、データサイズが大きくなるため、通常のデータと比べると性能は遅くなります。性能は遅いことを前提に設計していれば良いのですが、そうでないと、LOBの性能に全体の性能が影響されてしまいますので、注意が必要です(例えば、トランザクションに含めるとトランザクション性能が低下します)。LOBも通常のデータ型と同じように、パーティション化することが可能ですので、効果的に使用してください(以下のようにLOB列以外でパーティション化できます)。, (1)BASICFILE LOB UPDATEが多いテーブルでは、PCTFREEパラメータを増やして行移行が発生しないように調整する必要があります。ただし、PCTFREE領域を大きくすることは、Oracleブロック数が増加してしまうので、Oracleブロックの利用効率や圧縮するメリットが薄れてしまいます。また、PCTFREEパラメータを調整するとしても、すべてのOracleブロックで同じようにUPDATEされる訳ではないため、PCTFREEパラメータの調整は簡単ではありません。そのため、殆どがデフォルト(10)で使用しているのではないでしょうか。これは、ASSM(自動セグメント領域管理)を使用しても自動的に調整はしません。 まずは、表圧縮についてもう少し説明しましょう。 Please try again. まずは、BASICFILEについて説明します。 ① LOBセグメントの管理領域から未使用領域を検索します。 表圧縮について ここからは、これまで説明していなかったLOBデータ型の内部LOB(CLOB, BLOB, NCLOB)について説明しましょう(外部LOBのBFILEは、トランザクション管理外のためUNDO情報などは生成されませんので省略します)。 Oracleブロックは、UPDATEによって既存データのサイズが拡張されると、PCTFREE領域(将来のUPDATEのために用意する領域の割合)の空きを使用しても足りない場合に、第8回で説明した行移行が発生します。これは、圧縮されたデータでも同じようになります(圧縮の方がよりサイズが拡張し易くなります)。 性能ダウンしないようにするには、リソース不足などで性能ダウンしてからチューニングするのではなく、効果的にリソースを使用するようにすることと、そのときの性能ダウンを最小限にすることが重要です。その一つのソリューションが、ILMという考え方です。 SECUREFILEは、Oracle 11gからパフォーマンスの向上や管理(またはアプリケーション開発)の容易性のために、再設計された新しいLOBデータ型です。機能拡張として圧縮、暗号化、重複除外などの機能を提供します。ただし、自動セグメント領域管理(ASSM)の表領域を使用する必要があり、作成可能なのは内部LOBだけです。 Oracle University 無償オンラインセミナー(11月) Oracleではテキストデータを扱うことができます。このテキストデータ型は CLOB・NCLOBがあります。それぞれどのような違いがあるのか解説します。(Oracle12c) CLOB. CLOB: 最大サイズ: (4GB ... 、ネストした表、VARRAYまたはREF型の列を含むリレーショナル表)を作成する場合は、Oracleにより、ユーザー定義型の列はリレーショナル列にマップされ、その結果作成される非表示の列も、1000列の制限の対象として数えられます。 皆さんこんにちは、今年は10月から気温が低いので、日々の急激な寒暖差に身体がついていけませんね。今回は、Oracle... ※本記事は、Paul Toal (DISTINGUISHED SOLUTION ENGINEER Security Zones"を翻訳した... CAPTCHA challenge response provided was incorrect. BASICFILEのLOBデータは、以下のように固定長のチャンク単位にLOBセグメントに格納して、LOB索引で管理されます(Beforeイメージも同じように管理されます)。このLOB索引にLOBセグメントへのポインタが格納されていますので、LOBデータの検索時にLOB索引を使用して行います。, これに、LOBデータの挿入を行うと以下のように未使用領域の検索を行います(上記図のように行います)。 おわりに LOBとは LOBは、Oracle Databaseではバージョン8より利用可能な機能です。 LOBは、SQL99で標準のデータ型として定義されており、Oracleの場合、以下のような特徴があります。 大量のデータを保持するように設計されたデータ型 最大サイズは128TB (事実上、サイズ上限を気にしなくとも良 … プライマリ・コンテンツに移動, 1表当たりのLOB列の数は、1表当たりの列の最大数(1000, リテラル(SQLまたはPL/SQLの文字または数字). Copyright ©2002, 2015,Oracle and/or its affiliates. ② LOB索引を使用してBeforeイメージの検索を行います(上書き可能なUNDOデータを探すための処理です)。 Oracle(8.0.5以降)で、テーブル毎のサイズを知りたいのですが、どこにその情報はあるのでしょうか? テーブルが拡張されてそれぞれどの程度のサイズになっているのか、また、何%程度使用しているのか等が知りたいのです。 ョナル列にマップされ、その結果作成される非表示の列も、1000列の制限の対象として数えられます。Oracleによる、そのような表の合計列数の算出方法については、『Oracle Database管理者ガイド』を参照してください。, 『Oracle Database SQL言語リファレンス』. 津島博士のパフォーマンス講座 第78回 Oracle DatabaseのJSONについて, Maximum Security Zonesで、クラウドのセキュリティ対策の弱体化を防ぐ, チャンク・サイズが可変長になります。チャンク・サイズは、LOBデータ・サイズと領域の使用状況から自動チューニングされますので、CHUNKパラメータは無視されます(サイズが異なるLOBデータでも効果的に管理することが可能です)。, 基本はLOB索引を使用しません(行データに格納されているLOBセグメントへのポインタを使用します)。未使用領域の検索は、LOBセグメント内の管理情報(領域の使用状況)を共有メモリ上の”in-memory dispenser”にキャッシュされますので、それを使用して行われます(つまり、メモリ上のアクセスのため高速です)。”in-memory dispenser”に存在しない場合には、管理情報を参照して”in-memory dispenser”の更新を行います(このときRETENTION期間を過ぎているチャンクも更新されます)。, LOGGING句にFILESYSTEM_LIKE_LOGGING(メタデータ変更だけをREDOログに生成する)を指定することで、障害の平均リカバリ時間を削減できます。. ここで、何度か出てきているILMについて少し説明します。 Oracle University の無償オンラインセミナーに参加しませんか。11月は限定で ORACLE MASTER (5)表圧縮の問題点 oracleブロックは、updateによって既存データのサイズが拡張されると、pctfree領域(将来のupdateのために用意する領域の割合)の空きを使用しても足りない場合に、第8回で説明した行移行が発生します。 皆さんこんにちは、今年は雨が少ない変な梅雨ですね。気温の変化も大きいので体調は大丈夫でしょうか。私は、軽い風邪気味になってしまいましたので、皆さんも気を付けてください。 OracleのCLOB列のサイズをバイト単位で取得するにはどうすればよいですか?LENGTH()とDBMS_LOB.getLength()は両方ともCLOBで使用される文字数を返しますが、使用されているバイト数を … All rights reserved. Gold DBA のセミナー、Oracle Certified... 津島博士のパフォーマンス講座 Indexページ ▶▶ Oracle 11g R2より自動セグメント・アドバイザ機能の一部として、圧縮アドバイザ機能が追加され、OLTP圧縮を使用した場合に、節約できる領域のサイズをアドバイスします(サイズが 10Mバイト以上で、索引が3つ以上存在するテーブルが評価対象となります)。以下のようにdbms_space.asa_recommendations(またはOracle Enterprise Manager)を使用して行います。これにより、どのテーブルに効果があるかを確認することが可能です。, (5)表圧縮の問題点