問題タブ [database-link]
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 - 一度に複数の列を更新する (バリエーション)
Oracleで複数の列を更新しようとしていますが、いくつかのシナリオを経た後、以下のコードに落ち着きました。
私の問題は、より合理化されたコードが必要なものを更新していないのに対し、より複雑なものが更新されていないことです.数十万またはそれ以上の更新を見ているので、最小限の処理能力でこれを達成しようとしています.
したがって、最初のコードは次のとおりです。
さて、これを実行すると、上記のサブクエリに一致する約 700 レコードのみを更新する代わりに、テーブル 'table@database1' からすべてのレコードが更新され、その理由がわかりません (おそらく、私が理解していないことの 1 つです)。オラクル:))
しかし、以下を実行すると (唯一の違いは、サブクエリ全体を「存在する場所」に挿入することです)、これは必要なものだけを更新します。私の問題は、私が理解しているように、サブクエリが2回実行されることです.1回は更新で、もう1回はwhere句で実行されます.これは処理能力の無駄です.
注: 表示されない場合、同じスキーマを持つ複数の DB があります。マスタースキーマからの情報を使用して、DB 間でテーブルを更新しようとしています。一時テーブルは、更新が必要な異なるレコードのリポジトリとして機能します。マスター スキーマとの違いが 15% しかない場合、何百万ものレコードを更新する必要はありません。
db2 - Oracle DB リンク - where 句の評価
DB2 データ ソースと Oracle 12c ターゲットがあります。Oracleには、一般的に機能している定義済みのDB2へのDBリンクがあります。
今、DB2 に、行の変更用のタイムスタンプ列 (ROW_CHANGED と呼びましょう) を持つ巨大なテーブルがあります。特定の時間後に変更された行を取得したい。
ランニング
SELECT * FROM lib.tbl WHERE ROW_CHANGED >'2016-08-01 10:00:00'
DB2 では、約 1 行後に正確に 1 行が返されます。90秒で大丈夫です。
ここで、db リンクを介して Oracle から同じクエリを試します。
SELECT * FROM lib.tbl@dblink_name WHERE ROW_CHANGED >TO_TIMESTAMP('2016-08-01 10:00:00')
これは何時間も実行され、タイムアウトになります。私はいくつかのOracleドキュメントを読み、分散クエリの最適化のヒントを見つけましたが、それらのほとんどはローカルテーブルをリモートテーブルに結合することに言及していますが、これは私の場合ではありません.
必死になって、効果なしで DRIVING_SITE ヒントを試しました。
今、クエリの WHERE 部分がいつ評価されるのだろうか。クエリにDB2構文ではなくOracle構文を使用する必要があるため、Oracleが最初に完全なテーブルをコピーし、その後where句を適用しようとする可能性はありますか? 私はいくつかの調査を行いましたが、この方向に役立つものは何も見つかりませんでした.
ROW_CHANGED は、問題がある場合、DB2 の非表示の列です。
事前にヒントをお寄せください。
アップデート
@all 助けてくれてありがとう。私は何が私のためにトリックをしたかを共有します.
まず、DB2 列もタイムスタンプ (日付ではない) であるため、TO_TIMESTAMP を使用しました。これにより、暗黙的な変換を回避することが期待されていました。明示的な変換がなければ、ORA-28534: Heterogeneous Services preprocessing error
妥当な時間内に DB 構成に触れることはできません。
ところで説明計画はあまりもたらしませんでした。完全なヒントが表示され、述語に変換がありませんでした。確かに、ROW_CHANGED 列が Date として表示されましたが、なぜだろうか。
バインド変数を使用するという Justins の提案を試みましたが、再び ORA-28534 が発生しました。次に私がしたことは、それをpl/sqlブロックにラップすることでした(とにかく後でSPで実行します)。
これは、DB2 自体と同じ時間に実行されていました。残念ながら、これがデフォルトであるため、日付形式はここでは DD.MM.YY です。変数の割り当てを変更する場合
以前と同じ問題が発生しました。
一方、DB2 オペレーターは、その日の早い段階で要求した ROW_CHANGED 列にインデックスを作成しました。これにより、一般的に問題が解決したようです。私の元のクエリでさえ、すぐに終了します。