0

システムまたはカタログ テーブルを使用して特定のフィールドが参照されているすべてのテーブル/ビュー (つまり、すべてのオブジェクト) のリストを取得しようとしています。次のクエリを使用しています。

select * 
  from dba_col_comments 
 where column_name like('SXX_AXXX_%') 
 order by 1;

ただし、出力は揮発性です。何も変更せずに同じクエリを繰り返し実行すると、出力が異なります。たとえば、9300 のレコードが生成され、数分後に 9350 が生成され、数分後に 9347 が生成されました。

Teradata でも同じ動作を観察しています。

私の理論は、実稼働環境では、作成された一時オブジェクトはおそらくシステム/カタログテーブルにエントリを取得しているということです。

何か考え/指示はありますか?

4

1 に答える 1

0

global temporary tablesTeradataでは、インスタンス化された(SQLステートメントによって参照される)レコードをデータディクショナリテーブルTVMに追加する必要があることがわかります。これらのレコードは、セッションがログオフした後に削除され、CREATE GLOBAL TEMPORARY TABLE送信された元のステートメントに関連付けられたベーステーブルレコードのみが残ります。

これらのインスタンスは、ビューを使用して見つけることができますDBC.AllTempTables

Teradataではvolatile tables、データディクショナリ内で維持されません。

編集-マイレージは異なる場合がありますが、これでTeradataを使い始めることができます

SELECT D1.DatabaseNameI AS DatabaseName_
     , T1.TVMNameI AS TableName_
     , F1.FieldName AS ColumnName_
  FROM "DBC".TVM T1
 INNER JOIN
       "DBC".Dbase D1
    ON D1.DatabaseId = T1.DatabaseId
 INNER JOIN
       "DBC".TVFields F1
    ON F1.DatabaseId = T1.DatabaseId
   AND F1.TableId = T1.TVMId
WHERE F1.FieldName = 'MyColumn'
  --AND D1.DatabaseNameI IN ('{Database1}', ... '{Database99}') -- Filter on databases
  AND F1.FieldType in ('i', 'i1', 'i2', 'i8') -- Integer, ByteInt, SmallInt, BigInt
  --AND T1.TableKind IN ('T') -- Optional Filter to just tables.
  AND NOT EXISTS
     (SELECT 'x'
        FROM "DBC".TempTables TT1
       WHERE Tt1.TableId = T1.TVMId
     )
;
于 2013-01-14T21:26:51.480 に答える