質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Oracle Database 12c

Oracle Database 12cは、RDBMS製品です。世界初の商用RDBMSであるOracle Databaseのバージョンで、2013年にリリース。クラウド対応を考慮して設計されました。主な機能には、マルチテナント対応やインメモリデータベースの実装などがあります。

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

1回答

5440閲覧

OracleDBでのUpdate処理を高速化したい

shimeji_XX

総合スコア42

Oracle Database 12c

Oracle Database 12cは、RDBMS製品です。世界初の商用RDBMSであるOracle Databaseのバージョンで、2013年にリリース。クラウド対応を考慮して設計されました。主な機能には、マルチテナント対応やインメモリデータベースの実装などがあります。

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2021/11/17 06:49

前提・実現したいこと

SQL と OracleDB 初学者です。
仕事でSQLを扱うことになり学習を始めました。
TEST環境でTableの作成、データの更新(Update)を行っているのですが、
Update処理にとにかく時間がかかり困っています。
処理について指摘ありましたらお願いいたします。

発生している問題・エラーメッセージ

Update処理が遅い(3000行更新に5分程度かかる)

該当のソースコード

SQL

1--本番環境からテーブルをコピー 2CREATE TABLE TEMP_A_Table NOLOGGING PARALLEL 3 AS SELECT * FROM A_Table@[本番環境] 4/ 5--B TableのAns列を更新 6UPDATE B_Table B 7set B_Table.Ans = 8( 9 select A.Price 10 from TEMP_A_Table A 11 where B.Date >= A.Start_Date 12 and B.Date <= A.End_Date 13 and B.No = A.No 14 and B.Code = A.Code 15 and B.ID = A.ID 16) 17where B.Place = 'JPN'

試したこと

➀本番環境のDBが物理的に遠かったため参照用のTable Aを
テスト環境のサーバにコピーしました。
➁indexの作成(ユニークキー:B.Unique_no で作成、
whereの条件にユニークキーは無し)

補足情報(FW/ツールのバージョンなど)

使用ツール:PL/SQL developer , OracleDB 12c

もしSQLかOracleに初めて触る人におすすめの書籍等ありましたらお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

(1) CREATE TABLE

SQL

1--本番環境からテーブルをコピー 2CREATE TABLE TEMP_A_Table NOLOGGING PARALLEL 3 AS SELECT * FROM A_Table@[本番環境] 4/

これだとデータがコピーされるだけで、インデックスや制約などはコピーされません。

(2) UPDATE

SQL

1--B TableのAns列を更新 2UPDATE B_Table B 3set B_Table.Ans = 4( 5 select A.Price 6 from TEMP_A_Table A 7 where B.Date >= A.Start_Date ....8 and B.Date <= A.End_Date 9 and B.No = A.No 10 and B.Code = A.Code 11 and B.ID = A.ID 12) 13where B.Place = 'JPN' ....

① の部分で、TEMP_A_Table のインデックスが使用される可能性があります。
(No,Code,ID,Start_Date,End_Date) でインデックスを作成するといいと思います。

② の部分で、B_Table のインデックスが使用される可能性があります。
Place にインデックスを作成するといいと思います。

投稿2021/11/17 11:05

KOZ6.0

総合スコア2707

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shimeji_XX

2021/11/18 00:26

回答ありがとうございました。 indexの貼り方がよく理解できていなかったため簡潔に教えていただき助かりました。 簡略化していたのですが、実際にはis nullや関数で文字を抜き出している項目もあったためindexには効果がないと思い込んでいました。 実際に動かし、実行計画を確認したところ、index scanが正しく動作していることを確認いたしました。 また余談ですが、コピー元のA_Tableが90万行ほどあったためcreateの際where文で10万行程度に絞り込みました。 再度になりますが、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問