DWHの処理能力について

このQ&Aのポイント
  • DWHの導入を検討している際に、インポートしたいテーブル数が500超えてしまい、処理時間に1日かかってしまうという問題が発生しました。
  • 現在のシステムではオラクルのDBを使用しており、そのデータをDWH用のオラクルDBに写し、DWHにデータを入れる予定です。
  • 一般的に、DWHへのインポートできるテーブル数の制限や500テーブルを希望の時間でインポートする方法について知りたいです。
回答を見る
  • ベストアンサー

DWHの処理能力について

どのように質問すれば、良いのか自体あまりわかっていないのですが、 今後システムの仕事をすることになり、現在、DWHの導入を検討しております。 DWHの導入を考えているのですが、インポートしたいテーブル数が500超えてしまい、「500は多すぎる、これでは処理時間に1日かかってしまう。」と言われてしまいました。 元のシステムでオラクルのDBを使用しており、そのデータをDWH用のオラクルDBに写し、DWHにデータを入れるようにしようと考えております。 出来れば、3時間から4時間くらいで、インポートしたい(エンドユーザーがデータを確認できるように)のですが、一般的に、DWHへのインポートできるテーブル数はどのくらいなのでしょうか?また、500くらいのテーブルを希望の時間でインポートしたい場合にやりようはないのでしょうか。 分かる方いらっしゃいいましたら、ご教授ください。

  • MySQL
  • 回答数2
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • Siegrune
  • ベストアンサー率35% (316/895)
回答No.2

ANo.1です。 >基幹DBに顧客などのマスタテーブルや売上などのトランテーブルの数が約800あり、これらのデータを>毎日DWH用のDBへ差分更新します。 マスタは無視して、売上などのトランテーブルがいくつあるのでしょうか? これが数百あるなら分けたほうがいいというのが、前の回答の趣旨。 「xx別売上テーブルみたいな中間ワークテーブル」といっていたのが、 「DWH側のDBにビューを約500作成し」に相当します。 500も必要でしょうか? (ついついいくつも作ってしまうのがビューだったりします。) 例えば、課別月別売上ビューと部別月別売上ビューを別々に作ってしまったりとか。 (課別月別売上ビューがあれば部別月別に売上リストを出すのは結構早い。) 昔やった仕事で、縦軸、横軸の組み合わせ150個程の検索を、12個の中間ワークファイル (ビューと思ってください)で実現したことがあります。 ・・・ビューは、出力が遅ければ追加するという考え方で作っていくのも有りと思っています。 (もちろん、1伝票毎のトランザクションから出力させると遅いにきまっていますので、  最も細かい単位でのビューは作る前提のほうがいいですが。) 「ドクタサム」がよくわからないのであまりアドバイスはできないのですが、 ビューといっているけど実データを別に格納していて毎日更新する必要があるという前提と 考えられますので、効率よく更新する方法はあると思われます。 例えば、日別取引先別売上ビューがあるなら、月別課別売上ビューは、元データから更新する のではなく、日別取引先別売上ビューから更新するとか(前提として1取引先1課とする)。 あと、差分更新は、ちょくちょく、値があわなくなることがあります。 (あってはいけないのですが、バグやsqlを直接実行して削除したため、マイナスデータが 作れなかったとかいったイリーガルなオペレーションからおきることがあるので。) 例えば当月分を月末に全件再計算するとかしたほうが安全です。 毎日当月分を再計算するってほうがベターとは思いますが、処理時間とのバーターです。 >本来、基幹で作成しなければならなかった帳票などもDWHから出るようにしたいため プルーフリストとか入力内容を確認する帳票は、基幹で出すようにしてください。 基幹で正しいデータにしてからデータを受け取らないと、取り消しデータとか山のように データを受け渡ししなければいけないことになります。 ## ま、お分かりと思いますので余計なお世話なんですが。 ## とりあえず、こんなところで。 ## 後は個別にどんなデータとどんなビューがあって・・・ ## と1件ずつ掘り下げていく必要があるのですが、 ## QAサイトではそれもなかなか難しそうですね。

jkjk83310
質問者

お礼

Siegruneさん 重ね重ねご回答ありがとうございます。 トランテーブルは600くらいありますので、サーバは分けた方がよさそうですね。 また、ビューの必要性についても再度考えてみるようにしてみます。 いろいろ参考になりました。有難うございます。

その他の回答 (1)

  • Siegrune
  • ベストアンサー率35% (316/895)
回答No.1

>インポートしたいテーブル数が500超えてしまい ってキューブの数が500って言う意味ですか? ⇒もしそうなら、サーバを分けるべきでしょうというしかないです。 例えば、売上データ用DWHと経費データ用DWH・・・とかいった感じ。 そうじゃなくって、マスタデータとトランザクションデータが合わせて500という意味なら やりようはあります。 というか、500テーブルを毎日全件入れるのですか? マスタ類は差分をいれるように設計できませんか? 例えば、売上データのDWHなら、データは売上データの1種。 但し、xx別売上テーブルみたいな中間ワークテーブルがないと検索速度が遅いので つくっていますということなら、作成用のバッチを実行する。(またはこれもインポートすればよい) マスタ類は、依存関係がなければ並行処理できるのだから、同時に格納する。 サーバはマルチコアのサーバを用意しておけば、並行処理してくれるはず・・・。 とか何らかの対策をできるはずです。

jkjk83310
質問者

お礼

Siegruneさん ご回答ありがとうございます。 キューブというものがどういうものかあまりわかってしませんが、 基幹DBに顧客などのマスタテーブルや売上などのトランテーブルの数が約800あり、これらのデータを毎日DWH用のDBへ差分更新します。 また、DWH側のDBにビューを約500作成し、これらのビューもテーブルと一緒に多次元データベース差分更新をかけることになっています。 『500は多すぎる』といった部分は多次元データベースに更新かけるこのビューの数のようです。 サーバはXoen?といったCPUになり、ドクタサムといったものになります。 基本的に昨日までの内容に基づいた実績をDWHで確認し、本来、基幹で作成しなければならなかった帳票などもDWHから出るようにしたいため、毎日基幹のデータを更新する必要があります。 希望の要件を満たすためには複数のサーバに分けて処理する必要があるということでしょうか?

関連するQ&A

  • Oracleのトリガーについて

    Oracleのトリガーについて質問です。 旧システムから新システムへデータ移行を行おうとしているのですが、 新システムではNEWテーブル(仮名)が新規で追加されています。 データ移行の方法として、旧システムのダンプファイルをエクスポートし、 新ステムにユーザを再作成後インポートしました。 その後、あらかじめ新システムでNEWテーブルのみテーブル指定のエク スポートを行っていたダンプファイルより、追加でインポートを行いました。 これでデータ移行完了と思っていたのですが、NEWテーブルのデータはトリガー により生成されるらしいのですが、どのタイミングで生成されるのでしょうか? データ移行完了時はデータ0件です。 NEWテーブルをインポートする順番が逆なのでしょうか? それともインポートではトリガーは起動しないのでしょうか? または、トリガーの仕組みが消えている(?)のでしょうか? (納入先に行かないと確認できない状態なので実際のデータベースが確認できません…) Oracleはあまり詳しくないため、わかりづらい質問かもしれませんが よろしくおねがいします。 【環境】 Oracle11g R2 Windows2008Server

  • importについて

    こんばんは。 exportしたダンプファイルを頂いたので oracleにimportしようと思っています。 色々調べて以下のようにわかったのですが、 間違っていないか、パラメータで追加した方が よいものがあれば、ご指摘お願いします。 1) 既に同じ内容のテーブルが存在するが、それは気にせずimportを行う。既存のテーブルデータは新しくimportするもので更新されている??? 2) SQL*PLUSでコマンドを叩く。 コマンド内容は以下の通り。 imp system/manager fromuser=test1 touser=test2 file=db_data.dmp log=implog.log test1 ← DBA権限あり。 test2 ← このユーザーの表領域にデータを作成したい。

  • リアルタイムに他のDBにデータを反映させる方法

    現在、リアルタイムに自DBから他DBへのデータを反映させる仕組みを Oracle10gSE(Oracle10gSEone)で探しております。 OS:RedhatLinux4 ES Oracle:Oracle10.2.0.1.0SE (Oracle10gEEなら、レプリケーション機能を使って実現できそう かなとは思いますがライセンスまた私のスキルが足りないため 無理です。) 今考えていますのは Oracleのマテリアライズド・ビューを使って一定の間隔 (10秒毎、1時間毎、1日毎)でリフレッシュする方法です。 ●自Oracle ->  他Oracle ただ、自Oracle内のテーブルは50テーブル近く存在し、 レコードの件数ももっとも多いテーブルで 200万近くに及びます。(しかもカラム数は200・・・) DBサーバへの負荷も考慮し、高速リフレッシュを使うところは 使いたいと思っておりますが、この自Oracleは 他のシステムのDBもバッチプログラム、マテビュー等々で 使っているため、なるべくシンプルにしたいです。 (更新頻度が多いため、MVログを安易に作成したくありません) 設計を見直す上でも、テーブルのデータを他のDBのテーブルへ リアルタイムに(近く)反映させる方法はありませんでしょうか。 Oracleに限らず、さまざまな意見を聞けると大変ありがたいです。 よろしくお願いいたします。

  • ORACLE9iがわかる方

    SQL Plusからのデータのインポートの方法を教えていただきたいです。元データはACSESSで用意されていて、ORACLEの方にユーザーも作成してテーブルも用意しました。あとはACCESSのデータをORACLEの方にインポートしてあげればいいんですが、量が半端じゃないので出来ればSQL Plusでコマンド入力して一気にインポートしてしまいたいです。一応原始的に新規.MDBにリンクテーブルを作成し、元データから一つ一つ貼り付けしてもいいんですが、それでも時間がかかります。わかる方いらっしゃいますでしょうか???

  • アクセス→オラクルの方法は?

    アクセス(Access2000)で作ったサンプルDBを オラクル(Oracle9i)にインポートするためには どうすればいいのでしょうか。 そもそもできるのでしょうか。 テーブルだけでOKなんです。 いったんデータをcsvにはいてから? 逆方向(オラクル→アクセス)はよく見かけるのですが…

  • 処理速度の見積もり時間について。

    処理速度の見積もり時間について。 Oracle 10gを使用し開発を行っています。 処理速度について伺いたいことがあり、投稿致しました。 現在、PL/SQLを使用しCSVファイルよりデータを読み込み、 テーブルをチェックし、条件に合致するようならデータのUPDATEを 行うという処理をしています。 このCSVファイルのデータは何百万件と大量のデータで、 処理速度を懸念しております。 そこで処理速度についてですが、どのようにすれば見積もることが できるのでしょうか? 具体的な方法をご教授頂けるとありがたいです。 そもそもCSVファイルを一行ずつ読み込んで、テーブルに対し UPDATEを掛けるというやり方自体間違っているのでしょうか? 一時テーブル等を使用した方が良いのではないかとも思うのですが・・・。 以上、宜しくお願い致します。

  • オラクルDBのデータ削除タイミング

    お世話になります。 .NETとオラクルで作られた小さいシステムを引き継ぎました。 その中にメインになるDBがあり3ヶ月以前のデータは .NETの夜間削除処理APでDELETEしています。 そのメインDBにトリガーテーブルがあるのですが、1日分の データしか保存されていません。 しかし、どこで消えているのかが見つけられないでいます。 .NETの全APを検索してもないし、オラクルの機能であるような気が しているのですが、よくわかりません。 トリガーの条件は「INSERT」と「UPDATE」です。 どなたかヒントを下さい

  • あるタイミングでoracleの処理が遅くなることについて。

    質問です。 oracleにアクセスするWebシステムで、ある程度負荷をかけると処理が極端に遅くなります。 OS : Miracle Linux2.0 WebServer : Tomcat4.1.24 Oracle : 9.0.1 実際に行っている処理は、DBからデータを取得するだけです。データの量としても多くはなく、100件程度です。 コネクションプールを用いており、データソースからコネクションを取得し、ResultSetから結果を取得しています。 ResultSetからのデータ取得は、下記のようにwhile文でループさせています。ちなみに、next()を実行させているだけで、その他のことは何もしていません。 while( resultset.next()){ } 上記のような処理に対し、ボタンを20回ほど連打すると、処理が極端に遅くなってしまいます。処理の計測は、while文の前と後にcurrentTimeMillis()を設け計測しました。 1アクセスのみの時間は0.2sほどですが、連打をすると20sと遅さになります。 また、while文の最後にSystem.out.print()にて処理の終わりを確認しようと思ったのですが、処理が遅くなった途端、終わりまで到達せずに止まったような感じになり、20sほど経過してから、アクセスした分の処理が一気に終わるのです。 テーブルのロックか、もしくは、パフォーマンスの問題でしょうか?曖昧な説明で申し訳ありませんが、些細なことでもよろしいので、どなたかご教授願いますでしょうか。 よろしくお願いいたします。

  • ファイルDB連携で質問です。

    テーブルと同じレイアウトのテキストファイルを読込んで - 同一キーが存在し、データも同一なら何もしない - 同一キーが存在し、データが変更ならUPDATE文を作成 - 同一キーが存在しなければINSERT文を作成 しファイル出力したいのですが、 どんな手法がベストでしょうか? 私の考えつく方法はどうもDBを活かしきれていない気がします。DBはMySQL4でUNIONも使えるのですが、オラクルブロンズレベルでは思いつかず参っています。 ■テーブル(ファイルレイアウト)key1,key2は複合キー key1 key2 data1   1  0   5   2  3   6 ■処理の流れ ファイルがありテーブルが存在しなければ ファイル読込でテーブルへそのままインポート ↓ ファイルがありテーブルが存在したら、 既存テーブルをリネーム後に、 ファイル読込でテーブルへそのままインポート ↓ インポートしたテーブルを全件SELECTし、 リネームしたテーブルへ1件ずつSELECTマッチ処理を行った結果によりファイルへINSERTやSELECT文を出力していく。 ファイルの行数が多いと相当重い処理になりそうで。。

  • アナライズでほとんどの処理が遅くなった!

    ORACLE9の開発環境でデータをインポートしてANALYZEを行ったところ、半数以上の処理で著しくパフォーマンスが悪化しました。ANALYZEについて色々と調べている中では「たまに遅くなる場合がある」と言うニュアンスで受け取っていたのですが、多くの処理がとんでもなく遅くなると言う事態は想定していませんでした。 個々のSQLを調査するにしても数が膨大で時間がどれだけかかるか見当つきません。 一般論としてお聞きしたいのですが、ANALYZEをすることで多くの処理が遅くなってしまうような場合、何か根本的なところで誤りがあるのでしょうか?それともそういう場合もあるものなのでしょうか? また、ANALYZEをすることで遅くなる可能性のあるケースを具体的に紹介しているサイトはないでしょうか? よろしくお願いいたします。