优化SQL查询

时间:2012-01-15 21:42:24

标签: sql sql-server tsql

我创建了一些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)

1 个答案:

答案 0 :(得分:3)

  1. 需要进行一些排序才能找到最大值或最小值;也许使用排名函数而不是group by会更好但我坦率地期望查询分析器足够聪明,可以为这个特定查询找到一个好的查询计划。

  2. 子查询表现良好,只要它不使用外部查询中的列(在许多情况下可能导致它对每一行执行)。但是,我放弃了它,因为它没有任何好处。此外,我总是使用显式连接语法,但这主要是个人偏好的问题(对于内连接 - 外连接应始终使用显式语法完成)。

  3. 总而言之,我认为这些查询简单明了,足以在查询分析器中得到很好的处理,从而产生良好的性能。问这个问题你有特定的性能问题吗?如果是,请给我们更多信息(查询计划等),如果没有,请留下它们 - 不要过早优化。