3

dev、staging、および production の 3 つのデータベースがあります。すべてのコーディングは開発環境で行います。次に、すべてのコードとデータベースの変更をステージングにプッシュして、クライアントがライブ環境でどのように機能するかを確認できるようにします。彼らがサインオフした後、本番環境への最終的な展開を行います。

次に、これらの CLOB 列について: desc を使用したり、dev データベースの all_tab_columns ビューを照会したりすると、CLOB は 4,000 のデータ長を示します。しかし、ステージングおよび本番データベースでは、dev に相当する CLOB 列のデータ長は 86 のような奇数です。私は、これがどのように実現したかについて、考えられるすべての解決策を探しました。VARCHAR2の場合と同じように機能すると考えて、新しい CLOB(86) 列を追加しようとしましたが、Oracleはエラーを吐き出します。

DBA が何かを失敗させた可能性はありますか? これは心配することでもありますか?この結果、何も壊れたようには見えませんが、メタデータがすべての環境で同じであることを望んでいます.

4

4 に答える 4

4

まず第一に、私は-dbaとして-あなたとdbasの間の協力の欠如を見て申し訳ありません。私たちは皆、成功するために協力する必要があります。CLOBデータの長さは4000バイト未満にすることができます。

create table z ( a number, b clob);
Table created.
insert into z values (1, 'boe');

1 row created.
exec dbms_stats.gather_table_stats (ownname => 'ronr', tabname => 'z');

PL/SQL procedure successfully completed.
select owner, avg_row_len from dba_tables where table_name = 'Z'
SQL> /

OWNER                  AVG_ROW_LEN
------------------------------ -----------
RONR                       109

select length(b) from z;

 LENGTH(B)
----------
     3

塊の長さは4000以上であることがどこでわかりますか?

于 2011-04-16T22:02:38.810 に答える
4

DATA_LENGTH は、列の行内で使用される最大バイト数を格納します。CLOB を行に格納できる場合、最大値は 4000 です。LOBS が 4000 バイトを超えることはありません。行内ストレージが無効になっている場合、LOB は LOB データを検索するために必要なポインタ情報のみを格納します。これは 4000 バイトよりはるかに小さくなります。

SQL> create table t (clob_in_table clob
  2     , clob_out_of_table clob
  3  ) lob (clob_out_of_table) store as (disable storage in row)
  4     , lob (clob_in_table) store as (enable storage in row)
  5  /

Table created.

SQL> select table_name, column_name, data_length
  2  from user_tab_columns
  3  where table_name = 'T'
  4  /

TABLE_NAME                     COLUMN_NAME                    DATA_LENGTH
------------------------------ ------------------------------ -----------
T                              CLOB_IN_TABLE                         4000
T                              CLOB_OUT_OF_TABLE                       86

EDIT、*_LOBSビューに情報を追加

[DBA|ALL|USER]_LOBS ビューを使用して、定義された in row out of row ストレージ設定を確認します。

SQL> select table_name
  2     , cast(substr(column_name, 1, 30) as varchar2(30))
  3     , in_row
  4  from user_lobs
  5  where table_name = 'T'
  6  /

TABLE_NAME                     CAST(SUBSTR(COLUMN_NAME,1,30)A IN_
------------------------------ ------------------------------ ---
T                              CLOB_IN_TABLE                  YES
T                              CLOB_OUT_OF_TABLE              NO

EDIT 2、いくつかの参照

LOB記憶域の定義の詳細は、『Oracle Databaseアプリケーション開発者ガイド - ラージ・オブジェクト』のLOB記憶域に関する項を参照してください。特に、変更可能な内容について説明している3番目の注意事項を参照してください:

ノート:

一部のストレージ パラメータのみを変更できます。たとえば、ALTER TABLE ... MODIFY LOBステートメントを使用して、、、またはまたはRETENTION、 および 句を変更できます。PCTVERSIONCACHENO CACHE LOGGINGNO LOGGINGSTORAGE

ALTER TABLE ... MOVE ステートメントを使用して TABLESPACE を変更することもできます。

ただし、テーブルが作成されると、CHUNK サイズ、または ENABLE または DISABLE STORAGE IN ROW 設定を変更することはできません。

また、インデックス構成テーブルの LOB は次のように述べています。

デフォルトでは、オーバーフロー セグメントなしで作成された索引構成表のすべての LOB は、表外に格納されます。つまり、索引構成表がオーバーフロー・セグメントなしで作成された場合、この表のLOBのデフォルト記憶域属性はDISABLE STORAGE IN ROWになります。このような LOB に対して ENABLE STORAGE IN ROW 句を強制的に指定しようとすると、SQL でエラーが発生します。

これは、jonearles が索引構成表で LOB を作成したときに、data_length 列に 4,000 が表示されなかった理由を説明しています。

于 2011-08-26T23:54:41.140 に答える
3

CLOB には指定された長さはありません。ALL_TAB_COLUMNS をクエリすると、たとえば次のようになります。

select table_name, column_name, data_length
from all_tab_columns
where data_type = 'CLOB';

data_length は常に 4000 ですが、これは無視してください。

CLOB の最小サイズはゼロ (0) で、最大サイズはデータベースのブロック サイズに応じて 8 TB から 128 TB です。

于 2011-04-18T02:23:33.297 に答える
1

ik_zelf と Jeffrey Kemp が指摘したように、CLOB は 4000 バイト未満しか保存できません。

しかし、CLOB の data_lengths が常に 4000 ではないのはなぜでしょうか? この数によって実際に CLOB が制限されるわけではありませんが、サーバー上でメタデータが異なることを心配するのはおそらく正しいでしょう。すべてのサーバー上のオブジェクトに対して DBMS_METADATA.GET_DDL を実行し、結果を比較することができます。

索引構成表に CLOB を追加することで、data_length を小さくすることができました。

create table test
(
    column1 number,
    column2 clob,
    constraint test_pk primary key (column1)
)
organization index;

select data_length from user_tab_cols
where table_name = 'TEST' and column_name = 'COLUMN2';

10.2.0.1.0 では、結果は 116
です。11.2.0.1.0 では、結果は 476 です。

これらの数字は私には意味がありません。バグだと思います。しかし、さまざまなストレージ オプションについてよく理解していません。何かが足りないだけかもしれません。

ここで実際に何が起こっているか知っている人はいますか?

于 2011-04-18T07:06:43.753 に答える