こんにちは。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で質問しましょう!
似たような質問が見つかりました
- Oracle SQL update方法 2 2022/06/22 14:07
- PostgreSQL 列が存在しないと言われる 2 2023/02/10 18:33
- MySQL 複数DBテーブルからのデータ取得 3 2022/05/17 15:02
- MySQL 下の画像はSQLの4大命令の性質をまとめたものであるらしいです UPDATE INSERT DELE 1 2023/06/07 15:36
- Visual Basic(VBA) ExcelからAccessのテーブルに書き込む時に時間がかかる 1 2022/10/14 20:38
- Oracle 質問です。 下記のテーブルとデータがあり、 取得想定結果のように出力したいです。 下記のsqlだと0 2 2023/05/23 19:10
- Oracle sql(oracle)で質問です。 テーブルAのカラム名、日付(yyyymmdd)の値を テーブルB 2 2023/01/06 10:31
- Oracle SQLについて教えて下さい。 主キーを持ったカラムを主キーの機能を持たせたまま カンマ区切りで文字列 1 2023/03/27 22:47
- Ruby pandasでsqlite3にテーブル作成・追加・読み出しでindexの取り扱い方教えてください 5 2023/03/08 09:57
- Access(アクセス) Accessテーブルの結合で別々のテーブルのフィールドを組み合わせて値を出す方法について 2 2022/07/20 19:43
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
SQL 複数テーブルのupdate
-
LONG型の先頭250バイトを Varch...
-
SQLでSUMなどの関数でデータが...
-
SQL、2つのテーブルで条件一致...
-
特定のカラムが更新されたとき...
-
テストデータ作成に苦労しています
-
update文で改行を入れる
-
複雑な抽出条件のSQL文
-
DELETE文のWHERE条件にSUBSTRを...
-
sqlplusで表示が変なので、出力...
-
DBからタブ区切りのCSVデータを...
-
SQLです!!教えてください。
-
男性と2人で飲食店に行きテーブ...
-
QSL でのフォーム画面作成について
-
下の画像はSQLの4大命令の性質...
-
Excel テーブル内の空白行の削除
-
[1000地域 × 10カテゴリー = 1...
-
ちょっとぐらいの時間なら里山...
-
Notion@リレーション値の取得...
-
このテーブルで
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
テーブル名をカラムとして取得...
-
SQL、2つのテーブルで条件一致...
-
update文で改行を入れる
-
ROWNUMでUPDATEをしたいのです...
-
sqlplusで表示が変なので、出力...
-
SQL 複数テーブルのupdate
-
SQL*LoaderでCSVから指定した列...
-
SQLでSUMなどの関数でデータが...
-
SQLで違うテーブルの値を比較し...
-
カラム位置変更
-
UPDATE文
-
件数とデータを同時に取得する...
-
特定のカラムが更新されたとき...
-
Oracle(オラクル)で、日付時刻...
-
半角英数文字の抽出がしたい。
-
数値をNUMBER型にするかCHAR型...
-
DELETE文とロックについて
-
Oracleのview、synonymをCOMPIL...
-
SQL(oracle)でご助言いただきた...
-
SELECT文で指定桁数分抽出する...
おすすめ情報