1

前払いを使用しているユーザーの詳細レポートを作成する必要があります。

基本的に私は2つのテーブルを持っています。TBL_USER および TBL_PREPAID_DETAILS

tbl_user はユーザーのみをリストしますが、tbl_prepaid_details は借方、貸方、残高、合計トップアップなどの前払い情報をすべて含みます。

レポートは次のように作成されます。

FULLNAME USER_ID NEW_BALANCE CREATED DEPOSIT DEBIT TOTAL_DEPOSIT
USER1 1 250 21/05/2011 500 250 1000
USER2 2 250 21/05/2011 500 250 1000
USER3 3 250 21/05/2011 500 250 1000
USER4 4 250 21/05/2011 500 250 1000

これまではデータベースに SQL サーバーを使用していましたが、2012/2013 年には SQL サーバーから Oracle 11g に移行する必要があります。

以前のSQLクエリ(SQL Server)から、以下のクエリ(Oracle 11g)が出てきました。私は結果を得ることができますが、SQLサーバーでは約5分しかかからなかったのに対し、完了するまでにほぼ30分かかりました。そのわずか500人以上のユーザー

私は何かが足りないのですか?? プロセスを高速化するための簡易版はありますか?

SELECT DISTINCT A.FULLNAME AS NAME,
                A.USER_ID AS ID,
                B.NAME,

  (SELECT T.NEW_BAL
   FROM
     (SELECT NEW_BAL,
             USER_ID
      FROM TBL_PREPAID_DETAILS
      WHERE DATE_INSERT BETWEEN '01/01/2010' AND '14/11/2012'
      ORDER BY PREPAID_DETAIL_ID DESC) T
   WHERE T.USER_ID = A.USER_ID
     AND ROWNUM = 1) AS NEW_BALANCE,

  (SELECT T2.DATE_INSERT
   FROM
     (SELECT DATE_INSERT,
             USER_ID
      FROM TBL_PREPAID_DETAILS
      WHERE DATE_INSERT BETWEEN '01/01/2010' AND '14/11/2012'
      ORDER BY DATE_INSERT DESC)T2
   WHERE T2.USER_ID = A.USER_ID
     AND ROWNUM = 1) AS DATE_INSERT,

  (SELECT T3.PREV_BAL
   FROM
     (SELECT PREV_BAL,
             USER_ID
      FROM TBL_PREPAID_DETAILS
      WHERE DATE_INSERT BETWEEN '01/01/2010' AND '14/11/2012'
      ORDER BY PREPAID_DETAIL_ID ASC)T3
   WHERE T3.USER_ID = A.USER_ID
     AND ROWNUM = 1) AS DEPOSIT,

  (SELECT SUM(T4.CREDIT)
   FROM
     (SELECT CREDIT,
             USER_ID
      FROM TBL_PREPAID_DETAILS
      WHERE DATE_INSERT BETWEEN '01/01/2010' AND '14/11/2012'
      ORDER BY PREPAID_DETAIL_ID ASC)T4
   WHERE T4.USER_ID = A.USER_ID
     AND ROWNUM = 1) AS DEBIT,

  (SELECT SUM(T5.DEBIT + T5.PREV_BAL)
   FROM
     (SELECT DEBIT,
             PREV_BAL,
             USER_ID
      FROM TBL_PREPAID_DETAILS
      WHERE DATE_INSERT BETWEEN '01/01/2010' AND '14/11/2012'
      ORDER BY PREPAID_DETAIL_ID ASC)T5
   WHERE T5.USER_ID = A.USER_ID
     AND ROWNUM = 1) AS TOTAL_DEPOSIT
FROM TBL_USER A
LEFT JOIN TBL_PREPAID_DETAILS C ON A.USER_ID = C.USER_ID
LEFT JOIN TBL_ORGANIZATION_INFO B ON A.ORGANIZATION_ID = B.ORGANIZATION_ID
WHERE C.DATE_INSERT BETWEEN '01/01/2010' AND '14/11/2012'
  AND (A.USER_ID NOT IN ('xxx',
                         'xxx',
                         'xxx'))
GROUP BY A.FULLNAME,
         A.USER_ID,
         C.DATE_INSERT,
         B.NAME
ORDER BY A.FULLNAME;
4

1 に答える 1

2

Oracle Tuning の一般的な概要ヘルプについては、このページをご覧ください。 全体的なOracleチューニング・ページ

Oracle は、特定のクエリを改善するために追加できるインデックスなど、パフォーマンスを調整するためのツールを多数提供しています。これは、実行速度の遅いクエリに遭遇したときに最初に行うことの 1 つです。あなたの場合、クエリで説明計画を実行し、オラクルが推奨するものを確認することを検討します。これは、説明計画の実行に関するドキュメントです。Oracle Explain Plan

于 2012-11-14T17:06:08.317 に答える