Sql-Server

哪一個是更有效的查詢?

  • August 13, 2012

我有一張叫 STUDENT 的桌子

+-----------+-----------+-----------+---------------+
| StudentID | FirstName | LastName  | EnrollmenDate |
+-----------+-----------+-----------+---------------+
|         1 | x         | x         | x             |
|         2 | x         | x         | x             |
|         3 | x         | x         | x             |
+-----------+-----------+-----------+---------------+

寫一個查詢,拉出最後註冊的學生?

a) 按 EnrollmentDate Desc 從 STUDENTorder 中選擇 top 1 *

要麼

b) select * from STUDENT where EnrollmentDate = (select Max(EnrollmentDate) from STUDENT)

我傾向於在面試中問這個問題。一位候選人回答 b) 我期待 a)。哪一個是更好的查詢?

寫一個查詢,拉出最後註冊的學生?

第二個查詢不一定會這樣做,這取決於EnrolmentDate列的數據類型和數據的粒度。如果此列不包含時間分量,則查詢將返回一個學生註冊的最後一天註冊的所有學生,這不滿足問題。如果存在時間分量,則可能(但不太可能)將返回多行。

(編輯:亞歷克斯庫茲涅佐夫在評論中正確指出,第一個查詢不一定返回最後一個註冊的學生,或者當有關係時。但是,它保證在該事件中返回一條記錄,而不是**所有記錄,這通常是令人滿意的。我認為我的觀點更多的是比較兩個查詢是將蘋果與橙子進行比較,可以這麼說。)

無論如何,如果我們假設所有註冊日期/時間都是唯一的,那麼從給出的情況來看,問題的答案也不一定是明確的。您需要符合我所說的更高效的意思。

第一個查詢只會掃描一次,但可能會導致昂貴的排序(你沒有說表上存在哪些索引,所以我假設沒有)。後一個查詢將執行一次掃描以找到最大值,然後執行另一次掃描以查找所有匹配的行,這可能會使用更少的 CPU,但更多的邏輯 I/O。完全有可能第二個查詢總體上會更便宜(同樣,沒有可用的索引)。

說了這麼多,如果我要開始對這個業務操作進行性能調整,我肯定會從查詢(a)開始。

引用自:https://dba.stackexchange.com/questions/22403