問題タブ [exadata]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
sql - ExaData で実行される Oracle クエリの速度を向上させる
私はOracleクエリに取り組んでおり、それをより速くする必要があります。アドバイスをいただければ幸いです。
- データベースは Oracle で、ExaData クラスターで実行されます。
- Oracle バージョン: Oracle Database 11g Enterprise Edition リリース 11.2.0.3.0 - 64 ビット製品
私は2つのテーブルを持っています。
1) トランザクション: 店舗での購入 - TransactionID
2)TransactionItems:各購入には1..多くのアイテムがあります-TransactionID、ItemID
各テーブルには、次の 2 つのフラグがあります。
- FlagA: はい/いいえ
- FlagB: はい/いいえ
クエリは次のことを行う必要があります。
- TransactionItem のすべてのレコードに FlagA と FlagB の値を設定します。
- TransactionItem の Flags の値に基づいて、Transaction の各行の FlagA と FlagB の値を設定します。
クエリを 4 つのステップに分けました。
- TransactionItem のフラグ A の値を設定する
- TransactionItem のフラグ B の値を設定する
- トランザクションのフラグ A の設定値
- トランザクションのフラグ B の設定値
クエリはスムーズに実行されます。ただし、これが問題です。何十億ものトランザクション レコードがあり、各トランザクションには約 7 つのトランザクション アイテムがあります。
現在の速度は次のとおりです。
- 合計時間: 616 秒 / 10.27 分
- 毎秒 1,218 トランザクション / 毎分 73,000 トランザクションを処理
各ステップの処理時間を追跡しました。
TransactionItem のフラグ A の値を設定する
- 4分52秒
TransactionItem のフラグ B の値を設定する
- 3分26秒
トランザクションのフラグ A の設定値
- 1分6秒
トランザクションのフラグ B の設定値
- 0分51秒
以下は私の完全なクエリです。他に使用したテーブルはこちら
製品
- 各 TransactionItem には ProductId があります。 各製品には ProductCode があります。
- 1 つの製品コードには多くの製品があります
フラグ製品コード
- FlagA として分類される ProductCodes のリストを含む 1 つの列
フラグB製品コード
- FlagB として分類される ProductCodes のリストを含む 1 つの列
取引支払
- これは、各トランザクションの支払いの詳細を含むファクト テーブルです。
Payment_Dim
- PaymentID の TransactionPayment へのリンク
- これは、FlagB が Payment_Dim.PaymentName に基づいて設定されているために必要です。
私はこれらのインデックスを持っています:
トランザクション 1.TransactionID
TransactionItems 1.TransactionID 2.ProductID
製品 1. 製品 ID 2. 製品コード
FlagAproductCodes 1. ProductCode
FlagBproductCodes 1. ProductCode
支払い 1. PaymentID 2. PaymentCode 3. Payment_Name
助けてくれて本当にありがとう、ありがとう
oracle - Exadata 上の Oracle DB。更新が何時間も実行されていますが、並列ヒントが機能していません
2 つの巨大なテーブルがあり、約 6,000 万のレコードを更新しようとしています。以前は 30 分で更新されていましたが、現在は n 時間かかり、データの増加の 20% にも満たない. 詳細はこちら。「セルの単一ブロックの物理読み取り」「PX Deq: Table Q Normal」イベントで多くの待機があることがわかります。並列ヒントが機能しない理由がわかりません。それがセルシングルブロックの物理読み取りの理由ですか?または、パフォーマンスが低下する他の理由がありますか? 「WHERE EXISTS」句を取り除くことでパフォーマンスを向上させる理由はありますか?
table1(A) サイズ 316 GB レコード数 456,365,654
table2(B) 7GB レコード数 31,934,956
エクスレインプラン
database - Teradata から Oracle への移行の主キーとインデックス
Teradata から Oracle に移行していますが、DDL の主キーとインデックスについて質問があります。
ここにいくつかのシナリオと私がやっていることがあります:
1) Teradata には次のものがあります。
次にExadataで使用します:
2) Teradata には主キーはありませんが、次のものがあります。
次にExadataで使用します:
3) Teradata には主キーはありませんが、次のものがあります。
次にExadataで使用します
4) Teradata には主キーはありませんが、次のものがあります。
次に、Exadata で Create Index を使用します
ご覧のとおり、いつ Constraint Primary Key のみを使用する必要があるのか、いつ create index を使用する必要があるのかは完全には明確ではありません。どんな助けでも大歓迎です。
sql - Oracle Exadata - 結合条件で AND を使用すると、LEFT OUTER JOIN が INNER のように動作する
バックグラウンド
最近、私の会社は Oracle 11g から Exadata にアップグレードしました。すべての本番オブジェクトとデータが新しいシステムに正常に移行され、システム間で 1 対 1 の一致が確認されました。新しいシステムで ETL プロセスの最初の日次セットが完了した直後に、レポート テーブルが予想よりも大幅に小さいことがわかりました。さらに調査した結果、LEFT OUTER 結合に追加されたバッチ ID が問題を引き起こしていることがわかりました。11g では完全に機能していました。
質問
次のクエリが 11g では LEFT OUTER JOIN として扱われるのに、Exadata では INNER JOIN として扱われるのはなぜですか?
アップデート
ETL プロセスで使用されたクエリにタイプミスがあったか、元の開発者がこのケースを見落としていたようです。最後の結合を見ると、結合が ACTVY_KEY と BATCH_ID にあることがわかります。問題は、参照している BATCH_ID が ACTVY_MNGMT テーブルからのものであることです。データベースは基本的にこれを WHERE 句として扱うため、CALL_KEY が NULL の場合は失敗します。
oracle - Oracle Exadata でパーティショニングはどのように生成されますか?
バックアップ目的で 1 つの TBS にすべての月のパーティションを作成できるようにしたいので、オラクルがどのように作成したかを知りたいです。オラクルが自動的に生成するパーティション名の例は「SYS_P321847」です。
netsuite - Informatica を介して Netsuite から Exadata にデータをロード中にエラーが発生する
Netsuite から exadata にデータをロードしているときに、次のような 1 つのテーブルで次のエラーが発生します。
FnName: Fetch Optimize -- [NetSuite][ODBC 64 ビット ドライバー] 行にエラーがあります。FnName: Fetch Optimize -- [NetSuite][ODBC 64 ビット ドライバー][OpenAccess SDK SQL エンジン]データの取得に失敗しました。エラーチケット番号 iiap9cx01whniqe60ajrc[401]]
テーブルには約 80,00,000 のレコードがあります。約 5,10,000 レコードをロードした後、ロードに失敗しています。
同じように親切に案内してください。前もって感謝します。
よろしくお願いします。
oracle - オラクル ウェアハウス テーブルから 10 億レコードを削除する
誰かが別のテーブルから作成した巨大なテーブルがあり、それを削除したいと考えています。テーブルの切り捨て/削除の権利がありません。最善の解決策は何でしょうか。それはオラクルにあります。
今、私は簡単なものを与える予定ですDelete * from table
oracle - Oracle/ExaData RowNum Range が重複した行を返す
Javaプログラムのforループでexadataに対してこのクエリを実行しています
ここでは、数値を 10000 ずつインクリメントし続けるため、次のループ反復では、数値は 50001 と 60001 になります。
行を取得して別のデータベースに挿入し、再びループします。
現在、私のコードは次のようなランダムなエラーに遭遇します
ソース (exadata) データベースを確認すると、a=23 および b = ABC@XYZ.COM の行が 1 つしかありません。したがって、ソースには重複がありません。
ターゲット データベースを確認すると、行 a=23, b = ABC@XYZ.COM が前のループ反復で既に挿入されていることがわかります。{{プログラムの開始時に宛先テーブルをドロップして再作成します。}}
そのため、ウィンドウ クエリが同じ行を何度も返しているようです。
私は多くの検索を行いましたが、ウィンドウクエリが重複を返すべきではないと確信しています...しかし、そうであるようです
私は oracle/exadata の専門家ではありません。異なる rownum 範囲で実行した場合に上記のクエリが同じ行を返す可能性があるという変更があるかどうか教えてください。