我创建了一些MSSQL查询,所有这些查询都运行良好,但我认为可以更快地完成。你能帮我优化一下吗?
那是数据库:
Create table Teachers
(TNO char(3) Primary key,
TNAME char(20),
TITLE char(6) check (TITLE in('Prof','PhD','MSc')),
CITY char(12),
SUPNO char(3) REFERENCES Teachers);
Create table Students
(SNO char(3) Primary key,
SNAME char(20),
SYEAR int,
CITY char(20));
Create table Courses
(CNO char(3) Primary key,
CNAME char(20),
STUDYEAR int);
Create table TSC
(TNO char(3) REFERENCES Teachers,
SNO char(3) REFERENCES Students,
CNO char(3) REFERENCES Courses,
HOURS int,
GRADE float,
PRIMARY KEY(TNO,SNO,CNO));
1: 在哪个学年有大多数课程?
问题:看起来结果正在排序,而我只需要max元素。
select
top 1 STUDYEAR
from
Courses
group by
STUDYEAR
order by COUNT(*) DESC
2: 展示那些没有第一次学习课程的教师的TNO
问题:我只使用子查询来否定选择查询
select
TNO
from
Teachers
where
TNO not in (
select distinct
tno
from
Courses, TSC
where tsc.CNO=Courses.CNO and STUDYEAR = 1)
答案 0 :(得分:3)
需要进行一些排序才能找到最大值或最小值;也许使用排名函数而不是group by会更好但我坦率地期望查询分析器足够聪明,可以为这个特定查询找到一个好的查询计划。
子查询表现良好,只要它不使用外部查询中的列(在许多情况下可能导致它对每一行执行)。但是,我放弃了它,因为它没有任何好处。此外,我总是使用显式连接语法,但这主要是个人偏好的问题(对于内连接 - 外连接应始终使用显式语法完成)。
总而言之,我认为这些查询简单明了,足以在查询分析器中得到很好的处理,从而产生良好的性能。问这个问题你有特定的性能问题吗?如果是,请给我们更多信息(查询计划等),如果没有,请留下它们 - 不要过早优化。