0

2 つのテーブルから選択するデータベース ビューを作成しようとしています。次に例を示します。

USER_TABLE
- ID
- USER_NAME

FAMILY_TABLE
- ID
- FAMILY_NAME
- FATHER_USER_NAME
- MOTHER_USER_NAME
- GRANDFATHER_1_USER_NAME
... (multiple user name columns)

(テーブル ライターは、何らかの理由で ID を介して関連付けられませんでした)

基本的に、各ユーザーとそのユーザーが属する家族の名前を一覧表示するビューを作成する必要があります。いろいろ試してみましたが、どれも失敗のようです。

SELECT最初にからステートメントを結合しようとしましたFAMILY_TABLEが、それには時間がかかりました (以前の投稿を参照してください)。

次に、「または結合」を試みました。

SELECT ut.USER_NAME, ft.FAMILY_NAME
FROM USER_TABLE ut
LEFT OUTER JOIN FAMILY_TABLE ft ON
(
    UPPER(ut.USER_NAME) = UPPER(ft.FATHER_USER_NAME)
    OR
    UPPER(ut.USER_NAME) = UPPER(ft.MOTHER_USER_NAME)
    ... (etc)
)

ただし、これには長い時間がかかります (FATHER_USER_NAME と MOTHER_USER_NAME だけで 22 秒かかりました)。

必要なビューのクエリを作成する最も効率的な方法を誰かが提案できますか? 早くする方法がわかりません。

参考までに: Oracle 10g を使用しています。

4

2 に答える 2

0

これは明らかに速く動作します (約 500 ミリ秒):

SELECT ut.USER_NAME, familyInfo.FAMILY_NAME
FROM USER_TABLE ut
LEFT OUTER JOIN
(
    SELECT
    (
        UPPER(ft.FATHER_USER_NAME) || ',' || 
        UPPER(ft.MOTHER_USER_NAME) || ',' || 
        ... (etc)
    ) AS MEMBERS,
    ft.*
    FROM FAMILY_TABLE ft
) familtyInfo
ON familyInfo.MEMBERS LIKE ('%' || UPPER(ut.USER_NAME) || '%');
于 2012-10-23T16:58:13.267 に答える
0

UPPER(USER_NAME) と UPPER(FATHER_USER_NAME)、UPPER(ft.MOTHER_USER_NAME) に関数ベースのインデックスを追加します ...

これで問題が解決するはずです。

実行計画を貼り付けていただけますか?

于 2012-10-23T16:50:43.933 に答える