0

住所と郵便番号フィールドの数字に基づいて、従業員と一致する住所を持つベンダーを見つけるためにこれを作成しましたが、非常に遅い. クエリは、すべてのテキストを取り除き、数字を従業員テーブルからベンダー テーブルに結合します。

クエリのパフォーマンスを向上させる方法はありますか?

SELECT 
  T1.EMPLID, T1.NAME, T1.ADDRESS1, T1.ADDRESS2, T1.ADDRESS3, T1.ADDRESS4, T1.CITY, 
  T2.VENDOR_ID, T3.NAME1, T2.ADDRESS1, T2.ADDRESS2, T2.ADDRESS3, T2.ADDRESS4, T2.CITY
FROM PS_PERSONAL_DATA T1
JOIN PS_VENDOR_ADDR T2
ON 
  TRANSLATE(T1.ADDRESS1, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-#./ ,',' ') ||
  TRANSLATE(T1.ADDRESS2, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-#./ ,',' ') ||
  SUBSTR(T2.POSTAL,0,5) =
  TRANSLATE(T2.ADDRESS1, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-#./ ,',' ') ||
  TRANSLATE(T2.ADDRESS2, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-#./ ,',' ') ||
  SUBSTR(T2.POSTAL,0,5)
JOIN PS_VENDOR T3
ON T2.VENDOR_ID = T3.VENDOR_ID
WHERE T1.EMPLID <> T2.VENDOR_ID
AND  
TRANSLATE(T1.ADDRESS1, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-#./ ,',' ') ||
TRANSLATE(T1.ADDRESS2, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-#./ ,',' ') ||
SUBSTR(T2.POSTAL,0,5) NOT LIKE ' '
AND T2.VENDOR_ID IN
(
  SELECT VENDOR_ID
  FROM PS_VOUCHER
  WHERE PROCESS_INSTANCE <> 0
  AND POST_STATUS_AP LIKE 'P'
  AND VENDOR_ID NOT IN
  (
  '0000003730',
  '0000003318',
  '0000003555',
  '0000002422',
  '0000003458',
  '0000001089',
  '0000001450',
  '0000003809',
  '0000003255',
  '0000001903'
  )
  HAVING SUM(GROSS_AMT) > 5000 AND COUNT(VENDOR_ID) > 2
  GROUP BY VENDOR_ID
)
;
4

2 に答える 2

0

次のアプローチを検討します: -2 つの計算列を追加してテーブルを非正規化し、フォーマットの結果を使用する -それらの列に非プライマリ インデックスを追加する

次に、それらの列を結合して、はるかに高速に実行できます。

于 2014-07-10T16:42:28.387 に答える
0

理解した:

  • 郵便番号が間違ったテーブルを使用していた (T1 ではなく T2)
  • Vendor_ID 条件をサブクエリの外に移動しました

8 秒未満で実行されるようになりました。

SELECT 
T1.EMPLID, T1.NAME, T1.ADDRESS1 AS EE_ADDR, T2.ADDRESS1 AS VEN_ADDR, T1.ADDRESS2, T1.ADDRESS3, T1.CITY, T1.POSTAL,
T2.VENDOR_ID, T2.ADDRESS1, T2.ADDRESS2, T2.ADDRESS3, T2.CITY, T2.POSTAL
FROM PS_PERSONAL_DATA T1
JOIN PS_VENDOR_ADDR T2
ON 
TRANSLATE(T1.ADDRESS1, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-#./ ,',' ') ||
TRANSLATE(T1.ADDRESS2, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-#./ ,',' ') ||
TRANSLATE(T1.ADDRESS3, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-#./ ,',' ') ||
TRANSLATE(T1.ADDRESS4, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-#./ ,',' ') ||
SUBSTR(T1.POSTAL,0,5) =
TRANSLATE(T2.ADDRESS1, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-#./ ,',' ') ||
TRANSLATE(T2.ADDRESS2, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-#./ ,',' ') ||
TRANSLATE(T2.ADDRESS3, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-#./ ,',' ') ||
TRANSLATE(T2.ADDRESS4, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-#./ ,',' ') ||
SUBSTR(T2.POSTAL,0,5)
WHERE 
TRANSLATE(T1.ADDRESS1, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-#./ ,',' ') ||
TRANSLATE(T1.ADDRESS2, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-#./ ,',' ') ||
TRANSLATE(T1.ADDRESS3, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-#./ ,',' ') ||
TRANSLATE(T1.ADDRESS4, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-#./ ,',' ') ||
SUBSTR(T1.POSTAL,0,5) NOT LIKE ' '
AND VENDOR_ID NOT IN
  (
  '0000003730',
  '0000003318',
  '0000003555',
  '0000002422',
  '0000003458',
  '0000001089',
  '0000001450',
  '0000003809',
  '0000003255',
  '0000001903'
  )
AND VENDOR_ID NOT LIKE 'SF%'
AND VENDOR_ID NOT LIKE 'P%'
AND VENDOR_ID NOT LIKE '_______'
AND T2.VENDOR_ID IN
(
  SELECT VENDOR_ID
  FROM PS_VOUCHER
  WHERE PROCESS_INSTANCE  0
  AND POST_STATUS_AP LIKE 'P'
  HAVING SUM(GROSS_AMT) > 5000 AND COUNT(VENDOR_ID) > 2
  GROUP BY VENDOR_ID
)
;
于 2014-07-10T17:05:03.540 に答える