0

以下は私のクエリです。4 つの結合を使用して 3 つの異なるテーブルからデータにアクセスします。現在、1000 レコードを検索する場合、約 5.5 秒かかりますが、100,000 まで増幅すると、無限の時間のように見えます (最後の7時間でキャンセル..)

私が間違っていることを誰かが知っていますか?または、クエリを高速化するにはどうすればよいでしょうか?

このクエリは、おそらく数百万のレコードを返すために実行する必要があります。クエリをテストする目的で 100,000 に制限しただけで、この少量でも失敗するようです。

oracle 8の記録のために

CREATE TABLE co_tenancyind_batch01 AS
SELECT  /*+ CHOOSE */ ou_num,
x_addr_relat,
x_mastership_flag,
x_ten_3rd_party_source
FROM s_org_ext,
s_con_addr,
s_per_org_unit,
s_contact
WHERE s_org_ext.row_id = s_con_addr.accnt_id
AND s_org_ext.row_id = s_per_org_unit.ou_id
AND s_per_org_unit.per_id = s_contact.row_id
AND x_addr_relat IS NOT NULL
AND rownum < 100000

写真でプランを説明 : http://imgur.com/Xw9x4BA (読みやすい)

4

3 に答える 3

1

100,000 行に基づくテストは、何百万行も実行する場合、意味がありません。オプティマイザーは、入れ子になったループ結合を使用してストップキーがあると、クエリをより速く満たすことができることを認識しています。

非常に大きなデータ セットに対して実行する場合、別の計画が必要になる可能性が高く、ハッシュ結合が最も可能性が高くなります。カバリング インデックスはこれに役立つかもしれませんが、選択された列には、それらがどのテーブルから来たかを示す列エイリアスがないため、わかりません。大規模なハッシュ結合でメモリの問題が発生する可能性が最も高く、これはハッシュ パーティショニングで改善される可能性がありますが、Siebel の人々がそれを行う方法はありません。手動のメモリ管理を使用し、v$sql_workarea を監視して確認する必要があります。本当に必要な量。

(ちなみに、視覚的な説明計画は嫌いです)。

于 2013-08-13T11:40:58.083 に答える
0

最後の実行計画を見ると、データセットは巨大に見えます。次のように、返される行の数を制限する代わりに、ベース テーブルへのアクセスを制限できます。

CREATE TABLE co_tenancyind_batch01 AS
SELECT  /*+ CHOOSE */ ou_num,
x_addr_relat,
x_mastership_flag,
x_ten_3rd_party_source
FROM s_org_ext,
s_con_addr,
s_per_org_unit,
(select * from s_contact where rownum <= 100000) cont
WHERE s_org_ext.row_id = s_con_addr.accnt_id
AND s_org_ext.row_id = s_per_org_unit.ou_id
AND s_per_org_unit.per_id = cont.row_id
AND x_addr_relat IS NOT NULL

改善する必要がありますが、極端に速くはなりません。

于 2013-08-13T11:25:36.217 に答える
0

まず、S_CONTACT テーブルにインデックスがあり、それが有効になっていることを確認できますか?

そうである場合は、/*+ CHOOSE */ ヒントを使用して select ステートメントを試し、Explain Plan をもう一度見て、オプティマイザー モードがまだ RULE であるかどうかを確認します。このクエリでは、コストベースのオプティマイザーの方が良い結果が得られると思います。

それでもルールが変わらない場合は、データベース統計を更新して、もう一度やり直してください。バージョン 8i で導入された DBMS_STATS パッケージを使用できます。8iを使用していますか?

最後に、レコード番号、テーブル間のカーディナリティがわかりません。デザインを知っていればもっと参考になったかもしれません。

于 2013-08-13T10:52:36.517 に答える