7

フィールドがテーブルに存在するかどうかを判断するための高速なSQL文を探しています。

実は私はこの文を使っています

Select 1 
   from dual
   where exists (select 1 
                   from all_tab_columns 
                  where table_name = 'MYTABLE' 
                    and column_name = 'MYCOLUMN')

ORACLE に列が存在するかどうかを判断する最速の方法が必要だと思います。

アップデート

このクエリを複数回呼び出す大規模なソフトウェア システムを最適化しています。ソース コードを変更することはできません ;( 。外部ファイルに保存されているクエリを変更できるのは私だけです。

テーブル all_tab_columns には 100 万を超えるレコードがあります。

4

6 に答える 6

9

の主キーは でall_tab_columnsあるowner, table_name, column_nameため、特定の所有者を探す方が速くなります (または を使用しますuser_tab_columns)。

于 2010-02-16T21:05:54.963 に答える
2

このAskTomの記事を読むことをお勧めします。チェックする最速の方法は、まったくチェックしないことであると説明しています。

http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:698008000346356376

于 2010-02-16T21:10:37.840 に答える
1

このクエリで十分です。

 SELECT null
  FROM user_tab_columns
 WHERE table_name = 'MYTABLE' and column_name = 'MYCOLUMN'

唯一の最速の方法は、内部テーブルから直接クエリを実行することですが、これは推奨される方法ではなく、 sys オブジェクトに対する許可が必要です。

select null
from sys.col$ c
   , sys.obj$ o
   , sys.obj$ ot
where o.name = 'MYTABLE'
  and c.name = 'MYCOLUMN'
  and o.obj# = c.obj#
  and o.owner# = userenv('SCHEMAID')
  and ot.type#(+) = 13
  and (o.type# in (3, 4)                                    
       or
       (o.type# = 2 
        and
        not exists (select null
                      from sys.tab$ t
                     where t.obj# = o.obj#
                       and (bitand(t.property, 512) = 512 or
                            bitand(t.property, 8192) = 8192))))

このクエリはUSER_TAB_COLUMNS定義から取得され、異なるリリース (私の場合は 10gR2) で変更できます。このクエリでは、あなたから要求されていない情報への参照をカットしました。

とにかく、なぜこれをチェックしたいのですか?

于 2010-02-16T21:22:17.753 に答える
1

Oracle データ ディクショナリのクエリ - あなたの例が実際に行っているように、おそらく最速の方法です。

データ ディクショナリはメモリにキャッシュされ、クエリをすばやく満たすことができるはずです。テーブルの実際のスキーマ所有者がわかっている場合は、わずかに高速な結果を取得できる可能性があります。これにより、すべてのスキーマに対して検索するコストが発生しなくなります。

于 2010-02-16T21:06:19.727 に答える
0

この SQL クエリは、ユーザー「DSGIDEV」の列「NAVIGATION_ID」を持つすべてのテーブルの名前を指定します

select * from all_tab_cols where column_name = 'NAVIGATION_ID' and owner = 'DSGIDEV'

そのため、検索したい列で列名を変更し、所有者ID名で所有者を変更します。

于 2016-01-05T08:57:52.313 に答える