0

これは私が使用しているクエリです:

SELECT p.name, p.id
FROM v_emp e 
INNER JOIN  v_prof p ON e.code = p.code
WHERE e.emp_id IN  (SELECT  a.id 
                   FROM t_approval a 
                   WHERE  a.code1 <> 'R'
                   AND a.code2 = 'P'
                   AND a.date1 IS NULL 
                   AND a.date2 IS NULL
                   AND a.code3 = 'ADMIN'
                   GROUP BY a.id
                                   )
GROUP BY p.name, p.id
ORDER BY p.name

クエリの実行には4分以上かかります。テーブルt_approvalには1500万を超えるレコードがあり、検索条件に一致するこのテーブルからの個別のIDが必要です。

このテーブルには、すでにid、code1、code2、code3のインデックスがあります。

これをより速く実行する方法を教えてください。

4

1 に答える 1

5
  • クエリプランとは何ですか?
  • なぜ2つのGROUP BY条項が存在するのですか?どちらも必要ないように見えますが、データやデータ モデルがわからないため、結合条件が欠落しているという問題を隠蔽しようとしているかどうかを判断するのは困難です。
  • t_approvalサブクエリは1500 万行のうち何行を返しますか? 各述語はどの程度選択的ですか?
  • 他の 2 つのテーブルには何行ありますか? クエリ全体で返される行数は?
  • どのインデックスが利用可能ですか? あなたが話しているインデックスがt_approvalテーブルにあると仮定しています。ただし、単一の複合インデックスについて話しているのか、4 つの個別の単一列インデックスについて話しているのか、それとも何か他のことについて話しているのかは明確ではありません。他の 2 つのテーブルに存在するインデックスは明確ではありません。

クエリ プランを確認せずに、データ モデルがどのように見えるかを知らずに、述語がどの程度選択的であるかを知らずに、解決策について推測することはもちろん、問題が何であるかを推測することは非常に困難です。潜在的に、1 つのテーブルから列を選択しているだけであり、サブクエリが多数の行を返すと推測しているため、実行する方が効率的である可能性があります。

SELECT p.name, p.id
  FROM v_prof p  
 WHERE EXISTS( SELECT 1
                 FROM v_emp e
                      JOIN t_approval a ON (e.emp_id = a.id)
                WHERE e.code = p.code
                  AND a.code1 <> 'R'
                  AND a.code2 = 'P'
                  AND a.date1 IS NULL 
                  AND a.date2 IS NULL
                  AND a.code3 = 'ADMIN' )
 ORDER BY p.name

それでもうまくいかない場合は、さらに情報を投稿して、私たちを助ける必要があります。

于 2012-06-28T22:40:19.543 に答える