
こんにちは。Oracle11を使ってます。
大規模システムで大容量のテーブルを毎日バッチで取込む必要が出てきました。
そのテーブル自体カラムが30前後で、4000万件あります。
その処理時間に頭を悩ませていましたら、MERGE句に巡りあいました。
AテーブルからBテーブルに入れるのですが、列定義(Colum数も全く違う列も存在)が若干違うのですが、それでもこれを使うことは可能でしょうか?
A B
----- -----
A1 B1
A2 A2
A3 A3
A4 A6
A5 -
またべたのやり方ですと、Aテーブルを全件ループして、PK連結させて、Select-Insert or Select-Updateになると思うのですが、やはりデータがほとんど同じ場合と全件全部違う場合は、処理時間も軽減されるのでしょうか?
No.3ベストアンサー
- 回答日時:
Merge文のサンプル。
http://www.shift-the-oracle.com/sql/merge.html
Bテーブルの項目数や属性とAテーブルの項目数や属性に依存関係はないです。
例えば、Bテーブルのvarchar2に、AテーブルのdateからTO_CHAR()を使ってデータを格納する
とかもできますし、Aテーブルに項目がないので固定値をBテーブルに入れることもできます。
AテーブルとCテーブルを結合した結果を副問い合わせの形で指定すれば、複数のテーブルから
格納することすらできます。
ただね、利用できない条件がOracle10gではあった。
(11gの環境では試していないので大丈夫かもしれませんが)
例
MERGE INTO Out_Table
USING In_Table
ON ( Out_Table.Key_ID = In_Table.Key_ID)
・・・
で、In_Tableのデータが以下のような場合、
In_Tableのプライマリキー:Key_ID,UpdateDate
Key_ID,UpdateDate,・・・
A,2012/1/5
B,2012/1/5
C,2012/1/5
A,2012/2/4
D,2012/2/4
・・・
Out_TableのKey_IDにAが存在していなくて、
1回のmerge命令で同じレコードに対してInsertとUpdateが同時に行われる場合、
エラーになってました。
べたの場合より早いかどうかは、少なくとも遅くはないとはいえますが、処理によっては同じになる
かもしれませんので、早いとは言い切れません。
(でも、プログラムは見やすいのは確実。)
## ANO2の人が書いているXEとは、ユーティリティ類等の一部機能がなかったと思いますが、
## 基本的にOracleの機能が実装されたソフト。
## 利用条件にも制約はあったと思いますが、無償。
## サイズが大きいのでダウンロードでタイムアウトしないかどうかはわかりませんし、
## ダウンロード元が英語サイトなので、私は、ちょっと薦めるには躊躇しますが、
## ダウンロードして使う環境を作っておけば、いろいろ試せるので便利なことは確か。
## 私の使っているとあるノートPCでも動いていたりする。。。
ありがとうございます。依存関係は無いのですね。
ご提示いただいた例は正にマージする対象テーブル(元)のデータ構造として存在します。
(元)TBはPK指定なしのテーブル構成で、(入)TBはPK指定をしています。
貴重なお話ありがとうございました。
>dda167さん
すみませんでした。てっきり冷やかしの方かと思いました。
ノートPCの環境なので、DLして試してみたいと思います。
Oracleの機能が実装されているという事はPlsql・SQLloaderもあるかもしれませんね。Oracleは高くて買う気にもなりません。
やってみます。
No.2
- 回答日時:
>家に実行環境が無い
パソコンがあればXEをインストールするという手があります。
>リファレンスのページを見る限り出来なさそうですが
それだけでは回答のしようがありません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
SQL*LoaderでCSVから指定した列...
-
SQL、2つのテーブルで条件一致...
-
件数とデータを同時に取得する...
-
UPDATE文
-
テーブル名をカラムとして取得...
-
sqlplusで表示が変なので、出力...
-
oracleのエラー(ORA-00932)の...
-
SQL(oracle)でご助言いただきた...
-
DBからタブ区切りのCSVデータを...
-
update文で改行を入れる
-
execute immediate内の"'"
-
ROWNUMでUPDATEをしたいのです...
-
oracle 複数列を1列にまとめる
-
OracleのSQLで同テーブルのカラ...
-
LONG型の先頭250バイトを Varch...
-
DELETE文とロックについて
-
SQL文のCOUNTの戻り値は?
-
日付の古い順番に削除したいの...
-
Oracle(オラクル)で、日付時刻...
-
「テーブルに座って……」という...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
update文で改行を入れる
-
SQL*LoaderでCSVから指定した列...
-
SQL、2つのテーブルで条件一致...
-
SQLでSUMなどの関数でデータが...
-
SQL 複数テーブルのupdate
-
テーブル名をカラムとして取得...
-
sqlplusで表示が変なので、出力...
-
ROWNUMでUPDATEをしたいのです...
-
SQL(oracle)でご助言いただきた...
-
カラム位置変更
-
件数とデータを同時に取得する...
-
OracleのSQLで同テーブルのカラ...
-
LONG型の先頭250バイトを Varch...
-
数値をNUMBER型にするかCHAR型...
-
特定のカラムが更新されたとき...
-
半角英数文字の抽出がしたい。
-
DBからタブ区切りのCSVデータを...
-
sqlで質問です。 aテーブルとb...
-
SQLについて教えて下さい。 主...
-
Oracleのview、synonymをCOMPIL...
おすすめ情報