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ᛦ这些表上有什么索引?您是否可以使用subjectID
值而不是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);