2012-01-15 115 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