- ベストアンサー
一括更新のロールバックセグメントについて
msystemの回答
更新の条件がすべて当てはまるのであれば、100万件のロールバックセグメントが必要になります。(実際は、もう少しいる) まずひとつ、このSQL文を実行しても必ずしも100万回のサブクエリが走るとはいえません。Oracleのオプティマイザがもう少しいいパスを見つけるでしょう。 それから、先ほども書いたように、条件があわなければ、Updateをかけませんので必ずしも100万件の更新をするわけではありません。 ロールバックセグメントの容量が足りなくなれば、すべてロールバックされますので、何もなかったことになります。(件数によりますが、ものすごく時間はかかると思います)
関連するQ&A
- オラクルのロールバックセグメントって
教えて下さい。 oracleのロールバックセグメントって標準では RB1~RB5ですよね。 また、RB1からRB5までの振り分けっていうのは オラクルが自動的にしてくれてると認識してるのですが・・・ さておき、あるセグメント(例えばRB3)などが 集中的に使用されていて競合が発生し、レスポンス劣化に 繋がって困っています。私自身オラクル初心者なのですが 何か解決方法ってあるのでしょうか? ちなみにオラクルは7.3.4で言語はVB5で開発しています。
- ベストアンサー
- その他(データベース)
- 2つの表の整合をとる方法
こんにちは、 オラクルで2つの同じ表を同じデータに保つ方法について悩んでいます。 A表、B表共 COL1 プライマリキー COL2 COL3 として。 両テーブルのデータをあわせこみたいのですが、 過去ログを調べたところ、他方に無いデータの獲得についてはありましたのでそれを参考にINSERT文を作成しました。 INSERT INTO B ( SELECT * FROM A WHERE NOT EXISTS ( SELECT * FROM B WHERE A.COL1 = B.COL1 )) 上記SQLでAにあってBにないレコードがBに追加される事を確認しましたが、 COL1が同じでCOL2またはCOL3が違う場合の UPDATE文をどの様に記述すればよいか分かりません。 どなたかご教授願えないでしょうか?。
- 締切済み
- その他(データベース)
- oracleでwith句の結果を使ってupdate
oracleでwith句の結果を使って外部結合?でupdateしたいのですが 上手くいきません。 oracleでは無理なのでしょうか。 よろしくお願いいたします、。 /*---------- with v1 as ( select row_number() over(PARTITION BY ・・・ ORDER BY ・・・) as rnum ,no ,col1 ,・・・ from ・・・ ) update ( select A.col1 A_COL, v1.col2 B_COL from table1 A inner join table2 B on A.cd1=B.cd1 inner join v1 on A.no=v1.no where v1.rnum=1 and ・・・ ) set A_COL=B_COL ; ----------*/ と書いたのですが、 実際に実行してみると、 カッコ「(」、「)」がないとか、 selectが必要とか, A_COLやB_COLが無効ですとか、 となります。 どこが悪いのでしょうか。 oracleではupdateでwithは使えないのでしょうか。 よろしくお願いします。
- 締切済み
- Oracle
- データ削除、追加によるロールバックセグメントについて
環境:Oracle9i サーバ:Win2003 言語:VB6 テスト環境であるテーブルの200万件の削除、100万件の追加を行った後にVBアプリがすごく遅くなりました。 1.ロールバックセグメント(UNDOセグメント?)にデータがたまって遅くなったのでしょうか? またはテンポラリにデータがたまったのでしょうか? 2.削除や追加が行われた場合はどのオブジェクトにデータがたまったりするのでしょうか? 対応としてDBサーバのOSの再起動を行ったのですがまだ遅く、再起動後にDBの再起動を行ったらなぜか遅かったのが改善されました。 そもそも原因がデータの削除、追加で体感レベルで遅くなったりするのかも疑問です。 基礎知識が足りなくて申し訳ありませんが、アドバイスお願いいたします。
- ベストアンサー
- Oracle
- オラクルではできるのにSQLSERVERではサブクエリーで複数キーを指定できない?
サブクエリーで複数キーを指定したいです。例えば以下のようなSQLですが、 SQL> > select * from テーブルA > where (key1,key2) in (select key1,key2 from テーブルB) このSQLはオラクルでは実行できますが、SQLSERVERでは文法エラーになってしまいます。SQL SERVER ではサブクエリーで複数キーを指定するのは不可能なのでしょうか?
- ベストアンサー
- SQL Server
- ロールバックできず困っています。
1.テーブルAに、新たに列を追加したテーブルBを作成。 ↓ 2.テーブルAのデータをテーブルBにコピー。 ↓ 3.テーブルAを削除。 ↓ 4.テーブルBの名前をテーブルAに変更。 という一連の処理があります。 これらの処理でエラーが発生した場合、処理実行前の状態に戻したいのですが、ロールバックできずに消されるはずだった不要なテーブルが残ってしまいます。 何か方法はありますか?よろしくお願いします。
- ベストアンサー
- その他(データベース)
- SQL初心者です。
【Table1】 Col1 Col2 Aa A Ab A Ba B Bb B Ca C Ca D 【Table2】(Data1は固定) Data1 Data2 Aa A Ab B→A Ba C→B Bb A→B Ca B→C Ca C ※Col1に重複がある場合、重複結果の1行目のレコードをData2に入れる (今回の場合CをData2に入れる) Data1は固定で、Table1を使ってData2を上記の様に修正するSQLが書けなくて困っています。 Col1が重複してない場合の修正するSQLを書いてみましたが(合っているかはわかりませんが...)、 重複する場合のSQLも追加して最終的に1つのSQLで、すべて修正できるようにしたいです。 update Table2 T2 set Data2= (select Col2 from Table1 where Col1= (select Col1 from Table1 T1 where T2.Data1=T1.Col1 group by T1.Col1 having count(T1.Col1)=1 ) ) わかりにくい部分もあると思いますが、ご教授お願いします。
- ベストアンサー
- Oracle
- インラインビューの更新権限について
UPDATE句をインラインビューを使って実施しようと思い UPDATE ( SELECT A.FLD1,B.FLD2 FROM TBL1 A,TBL2 B WHERE A.KEY1=B.KEY1 AND CONCAT(A.KEY2,A.KEY3)=B.KEY2 AND B.KEY2='12345') C SET C.FLD1=C.FLD2 のようにSQLを書きました。 ORA-01779: キー保存されていない表にマップする列は変更できません のメッセージが出力されました。 CREATE VIEW TEST AS SELECT A.FLD1,B.FLD2 FROM TBL1 A,TBL2 B WHERE A.KEY1=B.KEY1 AND CONCAT(A.KEY2,A.KEY3)=B.KEY2 AND B.KEY2='12345' でビューを作って確認したら select * from user_updatable_columns where table_name='TEST'; OWNER TABLE_NAME COLUMN_NAME UPDATA INSERT DELETA ---------- ----------- --------------- ------ ------ ------ TEST TEST FLD1 NO NO NO TEST TEST FLD2 NO NO NO 確かにUPDATEできないようです。 テーブルはこんな感じです。 TBL1 ------------------------------------------- KEY1 NUMBER 4 PK KEY2 NUMBER 5 PK KEY3 NUMBER 1 PK FLD1 CHAR 6 TBL2 ------------------------------------------- KEY1 NUMBER 4 PK KEY2 NUMBER 6 PK FLD2 CHAR 6 同じように TBL3 ------------------------------------------- KEY1 NUMBER 2 PK KEY2 NUMBER 4 PK KEY3 CHAR 6 PK KEY4 NUMBER 4 PK FLD3 CHAR 6 TBL4 ------------------------------------------- KEY1 NUMBER 4 PK KEY2 CHAR 6 PK FLD4 CHAR 6 でビューを作ったら CREATE VIEW TEST2 AS SELECT A.FLD3,B.FLD4 FROM TBL3 A,TBL4 B WHERE A.KEY2=B.KEY2 AND A.KEY3=B.KEY3 AND A.KEY1='12' AND A.KEY4='1234' OWNER TABLE_NAME COLUMN_NAME UPDATA INSERT DELETA ---------- ----------- --------------- ------ ------ ------ TEST TEST2 FLD3 YES YES YES TEST TEST2 FLD4 NO NO NO 更新可能なようです。 ビューを作ったとき、UPDATEやINSERT文が有効・無効になる違いは何でしょうか? 毎回一旦ビューを作って select * from user_updatable_columns where table_name='TEST'; のような確認しかできないのでしょうか? よろしくお願いいたします。
- 締切済み
- Oracle
- 同一セグメントって何?
A 192.168.1.1 と B 192.168.2.1 は 同一セグメントでしょうか? どちらもデフォルトゲートウェイは 255.255.255.0 です。 今、AのPCからBのPCを PcAnywhereでリモートしたいのですが、 できるのかどうか知りたいです。 同一セグメントでないとできないという 噂を聞いたのですがこの場合はどうでしょうか? すみません。どなたか教えて下さい。
- ベストアンサー
- ネットワーク
- updateができない。
mysql-4.1.11を使っています。 ひとつのDBの中にtableがふたつあります。仮にtable1,table2とします。 このふたつのテーブルについて select * from table1,table2 where table1_col1=table2_col1; というふうにすると、table1_col1とtable2_col1の値が等しいものだけ抽出してくれます。table1_co1,table2_col2というのはそれぞれのテーブルのカラムのひとつです。 しかし、同じ条件で update table1,table2 set table1_col2="A" where table1_col1=table2_col1; という命令を実行しても 「Query OK, 0 rows affected (0.00 sec) Rows matched: 0 Changed: 0 Warnings: 0」 というメッセージが出るだけでtable1_col2の値が変わりません。本当なら3つのデータが変わるはずです。 命令の仕方がおかしいのでしょうか? ほかにおかしなところがあるのでしょうか? よろしくおねがいします。
- 締切済み
- MySQL
お礼
明快なお答え,ありがとうございます。 オプティマイザがもう少しいいパスを見つけるというのはなるほどと思いました。 ロールバックセグメントの件は了解です。実際、やってみたところロールバックされてしまいました(^^;;