2012-03-13 26 views
1

テーブルを作成する必要があります。テーブルには別のテーブルがあるフィールドがありますが、他のフィールドには値を入力したくありません。 IE:別のテーブルを作成せずにテーブルを作成する

テーブルAに何百万ものレコードがあり、同じタイプのテーブルAの3つの列を含むテーブルB(ビューではなく、テーブルになります)を作成したいとします。 。

私はそれを次のように行った:

CREATE TABLE B AS (
      SELECT column1,column2,column3 from A where 1=0; 
     ); 

をしかし、私はについて本当に心配すべての行をフェッチするパフォーマンスについて実行し、私はその方法について怖い(表は非常に多くの行を持って覚えておいてください)不条理な状態を確認してください。

したがって、私の質問は以下のとおりです。

  • は、すべての行またはSQLオプティマイザ のためにチェックされている条件は、自動的にそれを破棄しますか?

  • もっと良い方法がありますか?

ありがとうございます。

答えて

4

オプティマイザはコンパイル時に条件を評価し、フェッチ対象のデータに依存しない述語をチェックするために、すべてのデータを表からフェッチしません。

しかし、一般にCREATE TABLEステートメントは、SELECTステートメントに基づいてテーブルを作成するのではなく、適切なデータタイプを使用して作成するだけです。 CREATE TABLE AS SELECTステートメントを使用して作成しているテーブルに制約を定義するなどの操作はできません。これは実際に永続的なテーブルになる場合には本当に必要なものです。

DBMS_METADATA.GET_DDLプロシージャを使用してテーブルのDDLをフェッチし、そのDDLを手作業で変更して保持したいものだけを抽出することができます。

1

あなたの方法に間違いはありません。 Oracleは、最初に空の表を作成してから、その表にデータを挿入しようとします。 whereの条件がfalseを返すため、データは取得されないため、パフォーマンスの問題は発生しません。 私は10ミルの大きなテーブルでそれを試しましたが、パフォーマンスに問題はありません。

ミシェル。

関連する問題