0

この問題を解決するために Web を検索しましたが、うまくいきませんでした。これは、SOに関する私の最初のSQL質問でもあります:-)

私は単純な質問をする単純な男です - 実演させてください

select asy.aim_student_id, ast.aim_test  
from aim_student_test ast
  join aim_student_absent asa on (asa.aps_yr = ast.aps_yr and asa.aim_test = ast.aim_test and asa.aim_id = ast.aim_id)
  --join aim_student_qst asq on (asq.aps_yr = ast.aps_yr and asq.aim_test = ast.aim_test and asq.aim_id = ast.aim_id)
  join aim_student_yr asy on (asy.aps_yr = ast.aps_yr and asy.aim_student_yr_id = ast.aim_student_yr_id)
    where ast.aps_yr = '2012'

ご覧のとおり、join aim_student_qst はコメントアウトされています。

aim_student_qst は、すべての質問に対する学生の回答を一覧表示するテーブルです。したがって、1 人の学生は、このテーブルに ~50 のケースを持つことになります。何がクエリを遅くしているのかをテストするために、aim_student_qst の結合をコメントアウトしただけで、クエリが確実に高速化されました。

オラクルがやっていることは進んでいると思います-ああ、それらのテーブルが必要です。それらを1つの大きなテーブルに入れ、正確に何が必要かを探しましょう。これが、aim_student_qst で他に何もしていないにもかかわらず、クエリが遅くなる理由です。これは正しいです?

たとえば、50 問すべてではなく、生徒ごとに 1 つの問題を選択するだけで済みます。これを行う方法はありますか?

ありがとうございました!!!!!

4

1 に答える 1

1

もしかしてこれ?

select asy.aim_student_id, ast.aim_test  
from aim_student_test ast
  join aim_student_absent asa on (asa.aps_yr = ast.aps_yr and asa.aim_test = ast.aim_test and asa.aim_id = ast.aim_id)
  join aim_student_qst asq on (asq.aps_yr = ast.aps_yr and asq.aim_test = ast.aim_test and asq.aim_id = ast.aim_id)
  join aim_student_yr asy on (asy.aps_yr = ast.aps_yr and asy.aim_student_yr_id = ast.aim_student_yr_id)
where ast.aps_yr = '2012'
  and asq.question_number = 1 -- column name assumed
  and asq.question_answer is NULL -- column name and value assumed
;
于 2012-07-12T04:23:35.737 に答える