• 締切済み

oracleのinsert select性能

uresiiwaの回答

  • uresiiwa
  • ベストアンサー率45% (49/107)
回答No.5

【解決策】 1.まず、実行計画を確認しましょう。appendヒントがうまく効いているか、知りたいですね。 explain plan for SQL文; select * from table(dbms_xplan.display()); → "LOAD AS SELECT"ならダイレクトパスインサートになっている(appendヒントが効いている)。しかし、これだけ遅いと、なっていないのではないか。なっていない場合は、"INSERT STATEMENT"(通常INSERT)のはず。 2.ダイレクトパスインサートにならない理由としては、トリガーが設定されていることが考えられます。 select * from user_triggers; → 当該テーブルにトリガーはついていないでしょうか? 3.トリガーがついているのであれば、それが無効化しても良いものであれば、無効にしてINSERTすれば、ダイレクトパスインサートできると思います。 alter table tbl_temp_eoutsrcrate disable all triggers; SQL実行 -- 有効に戻す alter table tbl_temp_eoutsrcrate enable all triggers; しかし、意味があってトリガーがついているのであれば、単純に無効にするとダメかもですが、設計を確認してみてください。 【原因について】 トリガー以外だと、redoログやログバッファ、データファイルの配置や設定がまずくて更新処理が非常に遅いなんていう可能性もゼロではありません。はっきり特定するためには、トレースを取りましょう。 以下を実行するユーザにALTER SESSION権限が必要ですので無ければ権限付与してください。 alter session set sql_trace = true; SQL実行 alter session set sql_trace = false; → v$parameterの"user_dump_dest"にtrcファイルが出力される。そのファイルをtkprofコマンドで整形した結果を確認すると、何に時間がかかったかが分かる。

関連するQ&A

  • 別テーブルからselectした値を他のテーブルにinsertしたいのですが、上手くできません

    以下のように行ったのですが、 全ての値が別テーブルにinsertされません。 $sql = "SELECT tbl_A.id, tbl_A.data FROM tbl_A "; $rst = mysql_query( $sql ); while ( $col = mysql_fetch_array( $rst ) ) { $sql = "INSERT INTO tbl_B (          date, id, data ) VALUES ( '" . date( 'Y-m-d' ) . "', '" . mysql_real_escape_string( $col['id'] ) . "', '" . mysql_real_escape_string( $col['data'] ) . "' )"; } このやり方では、テーブル内の1つの値しかinsertされません。 selectされた全ての値をinsertするにはどのようにしたら良いのでしょうか? よろしくお願いします。 DB:mysql5 SP:php5

    • ベストアンサー
    • MySQL
  • ORACLE INSERT文を教えて下さい

    いつもお世話になっております。 以下のような処理を実現したいのですが、どうしてもいい方法が見つかりません。 実現するINSERT文を教えて頂けないでしょうか? よろしくお願いいたします ー処理ー TBL_Aを1レコードづつ読み込み、グループ情報のあるVIEWよりview_GRPCD取得し、TBL_Bへ出力する。 但し、グループ情報には、以下のように同一TENCDに対して複数のグループがヒットする為、日付の降順、 グループコードの降順で一番最初にヒットしたレコードのGRPCDを採用する。 【TBL_A】 │TENCD │SYOCD │URIAGE│ ┼───┼───┼───┼ │10100 │ 0100 │1,000 │ │10200 │ 0100 │2,000 │ │10300 │ 0300 │3,000 │ │22200 │ 0200 │2,200 │ 【View】 │NO│GRPCD │TENCD │ YMD │ ┼─┼───┼───┼───┼ │01│ 010 │10100 │02/01 │ │02│ 010 │10200 │02/01 │ │03│ 010 │10300 │02/01 │ │04│ 020 │10200 │01/01 │ │05│ 030 │10100 │05/01 │→TENCD:10100はこれを採用 │06│ 030 │10300 │03/01 │→TENCD:10300はこれを採用 │07│ 040 │10100 │03/01 │ │08│ 040 │10200 │03/01 │→TENCD:10200はこれを採用 │09│ 040 │10300 │03/01 │ │10│ 050 │10400 │05/01 │ 下記のほうに記載しているSQLで作成されるTBL_Bは以下のようになります 【TBL_B】(誤り) │TENCD │GRPCD │SYOCD │URIAGE│ ┼───┼───┼───┼───┼ │10100 │ 030 │ 0100 │1,000 │ │10200 │ 040 │ 0100 │2,000 │ │10300 │ 030 │ 0300 │3,000 │ 本来TBL_Bは以下のようにView上に存在しないTBL_Aのレコードでも出力させたく 以下のような結果を求めたいと思っています。 【TBL_B】(正解) │TENCD │GRPCD │SYOCD │URIAGE│ ┼───┼───┼───┼───┼ │10100 │ 030 │ 0100 │1,000 │ │10200 │ 010 │ 0100 │2,000 │ │10300 │ 010 │ 0300 │3,000 │ │22200 │ 000 │ 0200 │2,200 │※※※このレコードを作成することが出来ません※※※ ※SQLにある「NVL(View_GRPCD,0)」でVIEW上にないレコードの場合、GRPCDにゼロをセットして  出力できるかと思ったのですが、VIEW上にないレコードは作成されませんでした。  これを実現する方法を教えて頂きたいと思います。 ■TBL_B(誤り)は作成できるSQL CURSOR CUR_A IS SELECT TENCD,SYOCD,SUM(URIAGE) FROM TBL_A GROUP BY TENCD,SYOCD ORDER BY TENCD,SYOCD; BEGIN OPEN CUR_A; LOOP FETCH CUR_1 INTO w_TENCD, w_SYOCD, w_URI; EXIT WHEN CUR_A%NOTFOUND; INSERT INTO TBL_B( SELECT w_TENCD, NVL(View_GRPCD,0), w_SYOCD, w_URI FROM (SELECT View_TENCD,View_WRICD,View_GRPCD, RANK() OVER(PARTITION BY View_TENCD ORDER BY View_YMD DESC, View_GRPCD DESC) w_RANK FROM View WHERE View_TENCD = w_TENCD) WHERE w_RANK = 1); END LOOP; CLOSE CUR_A;

  • Insert Into Select での重複について

    DB:SQLServer2000 こんにちは お世話になっております。 トランザクションのテーブルA から ワークのテーブルBへInsert Into Select を使用してデータを格納しているのですが、その際に重複が発生してしまいます。 テーブルA 主キーあり テーブルB 主キーなし Delete B Insert into B select 項目1,項目2,・・・ from A With(Nolock) where 日付項目 = 20080101 テーブルAの主キー項目は全てテーブルBへInsertしており、Insert完了後のテーブルBの中身を見ると、まれに全く同じデータが2件出来ていることがあります。 このInsert into selectが実行されている間に、テーブルAに対して登録更新が行われることもあります。 色々と試してはいるのですが、原因が特定できずに困っております。 もし何かお気づきになられる方がいらっしゃいましたら、ご教示下さい。 よろしくお願い致します。

  • Access にて DISTINCROW を使用した INSERT SELECT

    お世話様です。 Access2003 VBAにて、DoCmd.RunSQLを使用してSQL文を流す際、 普通のINSERT-SELECT文はOKですが、 そのSELECT文にDISTINCROW句を使用していると、 数百件程度のSELECT結果しかINSERTできません。 本当は数千件のSELECT結果をINSERTしたいのですが、 これを実行した場合、エラーにもならず、1レコードもINSERTされません。 ためしに、DINSTINCTROWではなく、SQL文を変更してDISTINCTにしてみたところ、 2000件以上でもINSERTできました。 DISTINCROW句を使用して数千件でもINSERTできる方法はあるでしょうか? ちなみにSELECT単体ですと、DISTINCTROWを使用していながら、 数千件でも結果を表示できます。 SQL例: str_SQL = " INSERT INTO 結果テーブル(フィールド1, フィールド2, フィールド3)  SELECT DISTINCTROW A.項目1, A.項目2, B.項目1  FROM テーブル1 A, テーブル2 B  (WHERE句はあってもなくても現象変わらず)  ORDER BY A.項目4 ASC, A.項目5 ASC " DoCmd.RunSQL (str_SQL) よろしくお願いいたします。

  • select insertで複数テーブルから値を取得したい

    環境:oracle9i select insertで、2つのテーブルから値を取得して、1つのテーブルにinsertすることは可能でしょうか? たとえば、以下の場合、どのようなSQL文を書けばよいか、アドバイスいただけますでしょうか。 よろしくお願いします。 insertしたいテーブル:A Aテーブルの項目:o,p,q,r,s,t 値を取得するテーブル:B,C Bテーブルの項目:o,p,q,r Cテーブルの項目:o,p,s,t oとpが主キーになっていて、それらが一致するBとCのデータを あわせて、Aにinsertしたいと思っています。 insert into A(o,p,q,r,s,t) select このあと、どのように書けばよいのかがわかりません。

  • Insert文で・・・

    失礼します。SQL初心者なので質問します。 Insert into Aテーブル Select X , Y , Z From Bテーブル というSQLがあり、Aテーブルの列数を3から4にした際、AテーブルへのInsertの項目を、BテーブルからSelectされたX,Y,Z以外に普通の変数αも新たに作成した4つめの項目として同時にInsertしたい場合、どのようなSQLにすれば良いでしょうか? Insert into Aテーブル (Select X , Y , Z From Bテーブル),α みたいに都合良くはいきませんよね??

  • 入力値と外部キーをINSERTするには

    追加したいカラムが3つあるとしまして、そのうち2つはフォームからの入力値で、残り1つは別テーブルのIDをWHEREで引っ張ってきてINSERTしたい場合、INSERT...VALUES()とINSERT...SELECT構文を組み合わせないとダメかと思うのですが、組み合わせるとうまくいきません。2つの文に分けるしかないのでしょうか? やりたいことは下の感じのSQLです。が、解釈してくれません。 INSERT INTO room(A, B, C) VALUES (1, 2, SELECT other_table.id FROM other_table WHERE other_table.id = 1");

    • ベストアンサー
    • MySQL
  • SELECT * FROM tbl WHERE a = ?;

    SELECT * FROM tbl WHERE a = ?; 上記のSQL文で、?の部分がnullだとWHERE条件を無い状態に(SELECT * FROM tbl) のようにするにはどうすればいいでしょうか?

  • ????

    以下のクエリを実行しました。 insert into test_tbl(aaa,bbb,ccc) values('xx','yy','△△'); ※====『△』は半角スペース==== それで以下のsqlを実行すると select count(*) from test_tbl where ccc = '△△'; --- 1 --- と出ます。それで今度は以下のSQLを記述すると select count(*) from test_tbl where ccc = '△'; --- 1 --- とでます。 因みにテーブル構成は -------------- aaa char(2) bbb char(2) ccc char(2) -------------- です。 どうしてインサートしたデータが"△△"なのに "△"でひっかかるのでしょうか? しつこいようですが、記述中の'△'は半角スペースです。

  • SQLだけでselect結果に定数を加算して別TBLに保存可能?

    SQLだけでselect結果に定数を加算して別TBLに保存可能? 似たようなケースを見つけられず、質問させていただきます。 MYSQL5+PHP5の環境です。 「A_TBL」から特定条件でselectした結果を、「B_TBL」へ追加更新するSQLですが、「B_TBL」への追加時に一律、[gid]に「10」を加算して保存を行いたいのですが、sqlだけで可能でしょうか。 難しいようであれば、PHPで1行づつ処理を考えております。 REPLACE INTO B_TBL(gid,uid) SELECT gid,uid FROM A_TBL WHERE flg != 1; A_TBL、B_TBLのgid、uid共にint項目です。 よろしくお願いします。

    • ベストアンサー
    • MySQL