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

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

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

Oracle Databaseは、米オラクルが開発・販売を行うリレーショナルデータベース管理システムです。

SQL

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

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

Q&A

解決済

1回答

2059閲覧

【Oracle】大量空更新を行うための設計について

niboshi39

総合スコア6

Oracle Database

Oracle Databaseは、米オラクルが開発・販売を行うリレーショナルデータベース管理システムです。

SQL

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

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

0グッド

0クリップ

投稿2022/05/26 02:13

開発の設計について質問をさせてください。

抱えている問題

3分間隔で起動するJavaバッチを設計中です。
パフォーマンスが問われ、現在固まった仕様で気になる点がでてきました。

<処理概要>
(1)外部システムから直近1時間のデータを取得(推定1万件)
(2)取得したデータに対してOracleDBへUPDATEを発行(1万件分)
これを3分間隔で繰り返す。

この時、既に更新が行われたレコードも空更新(変更のない更新)を行い続けます。
3分間隔で取得した直近1時間のデータの内、実際に意味のある更新は数百件です。

へたな分岐は用意せず、とにかく特定の期間のデータを反映し続ける簡易バッチです。
この方式はDBログ/キャッシュにゴミが溜まりそうな気がしていて、DB全体のパフォーマンスに影響がでそうで不安です。

DBの細かい裏の仕様を把握しておらず、詳しい方いましたらアドバイスなどいただけますと幸いです。

<前提>
・主キーを指定した更新
・更新対象は1件。1回更新されれば以降、内容が変わることはないが、分岐は用意せず常に3分間隔/1時間はUPDATEを発行

考えている案

バッファ/キャッシュを利用しないAPPENDのオプションを使えば空更新でもDB全体のパフォーマンスは落とさず行けないかと考えています。
<参考にしたサイト>
https://atmarkit.itmedia.co.jp/ait/articles/0505/24/news104_2.html

宜しくお願いいたします。

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

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

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

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

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

KOZ6.0

2022/05/28 07:45

1万件のデータを引っ張てくるのは相手システムとの都合なんでしょうからしょうがないとしても、空更新を行う理由は何でしょうか? 1万件の中から更新が必要なレコードを抽出して更新を掛けるほうがパフォーマンスが上がると思います。 なお、APPEND ヒントは INSERT にしかつかえませんし、HWM(ハイウォーターマーク)の外側に書かれる、テーブルにロックがかかる、コミットしないと読めないという制約があるので、使用できるケースが限られます。
guest

回答1

0

ベストアンサー

Oracle Databaseのバージョン、Edition、プラットフォームを質問に追記しましょう。
1万件のデータ(CSV?)の取り込んで取り込んで、UPDATEするだけなら3分以内で余裕で終わるでしょうけど、24時間稼働しているシステムでしょうか?バックアップ/リカバリ設計はどうなっていますか?
パッチの適応など計画停止時の動作は?1万件のデータは今後増えることは考えられますか?それで3分で処理が終わらなくなっても許されますか?

Oracle Databaseでパフォーマンスを優先するなら最初からPL/SQLを使いましょう。
Javaで作ったけどパフォーマンスが悪くてPL//SQLで作り直す案件が時々あります。

Oracle Database が Enterprise EditionならPARALLELヒントが使えます。
CSVをテーブルに取り込むには SQL*Loader でDIRECT PATH LOADがいちばん早いはずです。
パフォーマンスを考えるシステムではいろいろ試してみていちばんパフォーマンスの良いやり方を選択します。
SQLの中でもUPDATEはコストが大きいことが多いです。極端な例ではDWHは通常UPDATEはしないか、本当に最小限の使用に限定します。INSERT ... SELECT SUM ... GROUP BY ... でどんどんデータを絞って行って、それぞれの集計用のテーブルに持っていきます。お役様の要望はどんどん変わりますから、それに合わせて集計方法も変わります。
データの寿命は?データの保存期間が過ぎたら削除できますか?SQLのDELETE文もREDOを吐くのでTRANCATE TABLEでPARTITIONING(有償オプションのOracle Partitioningが必要)を指定してデータを切り捨てます。

投稿2022/05/26 04:27

Orlofsky

総合スコア16415

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

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

niboshi39

2022/05/29 16:12

返信が遅くなり申し訳ありません。 ご丁寧に回答いただき有難うございます。 金曜日に要件が結構変わってしまい、一度方式を検討するタスクを追加していただきました。 既存のレコードに対して外部からJSON形式でデータを取得し、既存レコードをUPDATEする仕組みを考えているため、助言の通り性能要件を満たせるか心配になりました。 工数をいただき、プロトタイプを作成し、性能を図ることにしました。いただいた情報を参考にさせていただきます。 ありがとうございました。
Orlofsky

2022/05/29 17:08

JSONでパフォーマンスを要求するシステムを作るのは愚かです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問