Sql 查询需要很多时间

Sql 查询需要很多时间,sql,sql-server,query-optimization,Sql,Sql Server,Query Optimization,我有三张表,学生详细信息、学生分数和科目名称 受试者姓名 +----+------------------+ | ID | Sub_Name | +----+------------------+ | 1 | Maths | | 2 | Physics | | 3 | Chemistry | | 4 | Biology | | 5 | Computer Science | +----+-------

我有三张表,学生详细信息、学生分数和科目名称

受试者姓名

+----+------------------+
| ID |     Sub_Name     |
+----+------------------+
|  1 | Maths            |
|  2 | Physics          |
|  3 | Chemistry        |
|  4 | Biology          |
|  5 | Computer Science |
+----+------------------+
学生资料

+----+------------+-----------+-----+-------+--+
| ID | First_Name | Last_Name | Age | Class |  |
+----+------------+-----------+-----+-------+--+
|  1 | Rohit      | Sharma    |  28 |     3 |  |
|  2 | Shikhar    | Dhavan    |  27 |     2 |  |
|  3 | Virat      | Kohli     |  29 |     3 |  |
|  4 | MS         | Dhoni     |  30 |     2 |  |
|  5 | Hardik     | Pandya    |  25 |     3 |  |
+----+------------+-----------+-----+-------+--+
学生成绩

+----+------------+------------+---------------+
| ID | Student_Id | Subject_Id | Subject_Marks |
+----+------------+------------+---------------+
|  1 |          1 |          1 |            90 |
|  2 |          1 |          2 |            82 |
|  3 |          1 |          3 |            85 |
|  4 |          1 |          4 |            75 |
|  5 |          1 |          5 |            92 |
|  6 |          2 |          1 |            90 |
|  7 |          2 |          2 |            82 |
|  8 |          2 |          3 |            85 |
|  9 |          2 |          4 |            75 |
| 10 |          2 |          5 |            92 |
| 11 |          3 |          1 |            90 |
| 12 |          3 |          2 |            82 |
| 13 |          3 |          3 |            85 |
| 14 |          3 |          4 |            75 |
| 15 |          3 |          5 |            92 |
+----+------------+------------+---------------+
我使用这个查询来获取结果

select sd.First_Name
      ,sd.Last_Name
      ,sm.Subject_Id
      ,sm.Subject_Marks
from Student_Marks sm
    inner join Student_details sd
       on sm.Student_Id = sd.ID
where sm.Subject_Id in (select ID
                        from Subject_Name
                        where Sub_Name in ('Maths', 'Physics')
                       )
  and Student_Id in (select ID
                     from Student_details
                     where class in (2,3)
                    );
现在,这个查询花费了太多的时间来获取结果

如何优化此查询


编辑:

我使用hibernate获取结果,因此实际查询是:

select sd.First_Name
      ,sd.Last_Name
      ,sm.Subject_Id
      ,sm.Subject_Marks
from Student_Marks sm
    inner join Student_details sd
        on sm.Student_Id = sd.ID
where sm.Subject_Id in :SubName
  and Student_Id in (select ID
                     from Student_details
                     where class in :ClassIds
                    );
试试这个:

select sd.First_Name
      ,sd.Last_Name
      ,sm.Subject_Id
      ,sm.Subject_Marks
from Student_Marks sm
     inner join Student_details sd on sm.Student_Id = sd.ID
     inner join Subject_Name sn on sm.Subject_Id = sn.ID AND Sub_Name in ('Maths','Physics')
     inner join Student_details on Student_Id = Student_details.ID AND class in (2,3)

我不理解学生详细信息子查询。为什么说“给我你在查找2或3级的学生详细信息时找到的学生详细信息”而不是“给我2或3级的学生详细信息”

至于
subject\u name
:我加入表中,以便显示其名称。只选择ID并猜测哪个是数学,哪个是物理是没有意义的

您应该提供以下索引:

create index idx1 on subject_name(sub_name, id);
create index idx2 on student_details(class, id);
create index idx3 on student_marks(student_id, subject_id);
create index idx4 on student_marks(subject_id, student_id);
甚至包括指数:

create index idx1 on subject_name(sub_name, id, sub_name);
create index idx2 on student_details(class, id, first_name, last_name);
create index idx3 on student_marks(student_id, subject_id, subject_marks);
create index idx4 on student_marks(subject_id, student_id, subject_marks);

我不能说将使用索引idx3还是idx4。试试看,把没用的扔掉。(当然,DBMS可能决定根本不使用这些索引;它们只是一个报价。)

您是否做了
解释
来了解其中的关键点?实际上,有5万名学生的详细信息和1个CR.+行的学生分数。因此,查询需要3分钟以上的时间。我想减少这一时间@B001ᛦ这些表上有什么索引?您是否可以使用subject
ID
值而不是
Sub\u Name
?查询中的subject Name和class是来自java代码的列表。有没有办法从查询中删除此项。@iamdaveAre是否只传递主题名而不传递ID值?如果没有,您能否更改您的应用程序以执行此操作?
create index idx1 on subject_name(sub_name, id, sub_name);
create index idx2 on student_details(class, id, first_name, last_name);
create index idx3 on student_marks(student_id, subject_id, subject_marks);
create index idx4 on student_marks(subject_id, student_id, subject_marks);