2011-08-25 143 views
25

我不得不復習一些代碼,並且遇到了某人做了某事,並且想不出我的方式更好的原因。它可能不是,那麼,哪個更好/更安全/更有效?MAX vs Top 1 - 哪個更好?

SELECT MAX(a_date) FROM a_table WHERE a_primary_key = 5 GROUP BY event_id 

OR

SELECT TOP 1 a_date FROM a_table WHERE a_primary_key = 5 ORDER BY a_date 

我會去與第二個選項,但我不知道爲什麼,如果這是正確的。

回答

13

如果您的表已編入索引,則性能通常相似。

值得考慮,但:Top通常纔有意義,如果你訂購你的結果(?否則,什麼top

訂購的結果需要更多的處理。

最小值並不總是需要排序。 (只要看情況而定,但通常你不需要按順序排序等)

在你的兩個例子中,我期望速度/ x-plan非常相似。你總是可以轉向你的數據來確定,但我懷疑這種差異是否會顯着。

+1

SQL Server TOP 1的行爲與使用rowNum = 1的Oracle不同。 Oracle實際上並沒有搶在訂購之前找到的第一個,所以這個方法僅對SQL Server有效。這個TOP 1 vs Max()的另一個好處是,只要你包含適用的順序,你可以根據需要抓取儘可能多的列。我使用Max()進行了測試,發現即使使用GROUP BY,它也不會只產生1條記錄。也許有人更強大的mojo可以說,如果你想從多列無w/o子查詢獲得頂部如何獲得一行? – gordon

10

他們是不同的查詢。

第一個返回多個記錄

第二個返回一個記錄(最小a_date內發現a_primary_key = 5)(用於內a_primary_key = 5找到的每個event_id最大a_date)。

+2

o.O第一個查詢仍然會返回一條記錄 –

+1

@Shredder提供'a_primary_key'實際上是一個主鍵,它會的。但是,如果它是主鍵,則'a_date'中只有一個日期,並且既不需要'max'也不需要'top'。 – GSerg

+0

即使不是,它仍會返回一條記錄。 http://www.w3schools.com/sql/sql_func_max.asp –

0

MAXTOP的功能不同。您的第一個查詢將返回找到的最大值a_date,其中a_primary_key = 5找到的每個不同的event_id。第二個查詢將簡單地抓取第一個a_date,並在結果集中找到a_primary_key = 5

+1

它不會獲取第一個值。 'top'與'as by asc'結合時,會選擇最小的值。 – GSerg

+0

你是否吸菸兄弟,給我一些..它*會*抓住找到的第一個值,是的,在這種情況下,它將是最小的,因爲ASC的排序從最小到最大,使第一個值最小.. –

5

對於查詢有你需要同樣的結果:

SELECT MAX(a_date) FROM a_table WHERE a_primary_key = 5 

SELECT TOP 1 a_date FROM a_table WHERE a_primary_key = 5 ORDER BY a_date DESC 

知道這是更快,最好的辦法是檢查查詢計劃,做你的基準。影響速度的因素很多,例如表/堆大小等。甚至可以優化相同數據庫的不同版本,以支持一個查詢。

+3

不需要在第一個示例中進行分組(因爲根據WHERE子句只有一個組)。 – Chains

+0

@kuru:我不確定你可以使用一個集合函數,但如果是這樣的話......你是對的 – vol7ron

+3

只要你只選擇aggs(就像你在回答中一樣),你沒事。如果你在select中包含一個非agg值,那麼你確實需要一個group。 – Chains

0

我在一個表上有20,00,000+記錄執行max和頂部, 發現頂部比最大或最小功能可以較快導致與秩序。

所以,最好的方法是在一段時間內逐個執行您的查詢,並檢查連接所用時間。