2012-01-15 116 views
0

我已经创建了一些MSSQL查询,它们都工作得很好,但我认为它可以以更快的方式完成。你能帮我优化它们吗?优化SQL查询

这就是数据库:

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: 在其研究一年有大部分课程?

问题:它看起来像结果被排序,而我只需要最大元素。

select 
    top 1 STUDYEAR 
from 
    Courses 
group by 
    STUDYEAR 
order by COUNT(*) DESC 

2: 显示没有课程,由第1 studyear谁的教师的外海王星天体

问题:我使用子查询只否定一个选择查询

select 
    TNO 
from 
    Teachers 
where 
    TNO not in (
    select distinct 
     tno 
    from 
     Courses, TSC 
    where tsc.CNO=Courses.CNO and STUDYEAR = 1) 
+0

我已经修复它,甚至添加家庭作业标签,如果你说它是相关的。作业是创建一个查询,优化它是我自己的努力。 – gisek 2012-01-15 22:26:17

回答

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

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

因此总而言之,我认为这些查询非常简单明了,足以在查询分析器中很好地处理,从而获得良好的性能。问这个问题你有特定的性能问题吗?如果是的话,给我们更多的信息(查询计划等),如果不是,就让他们 - 不要过早优化。

+0

'需要进行一些排序才能找到最大值或最小值' - 我现在不知道dbms如何处理它,但它看起来像排序O(nlogn),而我只需要它的最大值O(n)除非它自动处理。 – gisek 2012-01-15 21:58:15

+0

我没有任何具体问题 - 这只是出于教育原因。 :) – gisek 2012-01-15 21:58:57

+0

@gisek,查询分析器创建一个查询计划,它可能会完成与您在代码中编写的内容完全不同的内容。 SQL不是一种命令式语言,您可以逐步确定要做什么;相反,您需要定义您想要获得的内容,并让SQL引擎找出如何以最佳方式完成此操作。 – Lucero 2012-01-15 22:07:04