2011-08-25 27 views
25

Bazı kodları incelemek zorunda kaldım ve birinin yaptığı bir şeye rastladım ve benim yolumun daha iyi olduğuna dair bir sebep düşünemedim. Ve muhtemelen değil, yani, daha iyi/daha güvenli/daha etkili?MAX vs Top 1 - hangisi daha iyi?

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

YA ben 2 seçeneği ile giderdi

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

, ama neden emin değilim ve Doğru olup olmadığını.

cevap

13

değer olsa dikkate: sonuçlarınızı sipariş konum Top genellikle sadece mantıklı (? Aksi halde neyi ait top) bir sonuç Sipariş

fazla işlem gerektirir.

Min her zaman sipariş gerektirmez. (Sadece bağlıdır, ancak genellikle sizin veya gruba göre siparişe gerek yoktur, vb.)

İki örneğinizde, hız/x-planının çok benzer olmasını beklerdim. Emin olmak için istatistiklerine her zaman başvurabilirsin, ama farkın önemli olacağını sanmıyorum.

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 

daha hızlı olduğunu bilmek iyi yolu sorgu planını kontrol etmek ve kriterleri yapmaktır: sorgular için

+1

SQL Server TOP 1, rowNum = 1 kullanarak Oracle'dan farklı davranır. Oracle aslında sipariş önce ÖNCE bulduğu ilk yakala, bu nedenle bu yöntem sadece SQL Server için geçerlidir. Bu TOP 1 ile Max() arasındaki bir diğer avantaj, geçerli siparişi verdiğiniz sürece istediğiniz kadar çok sütun alabilmenizdir. Max() kullanarak test ettim ve GROUP BY ile bile sadece 1 kayıt vermediğini gördüm. Belki de daha güçlü bir mojo gibi bir kişi, bir alt sorgu ile birden çok sütuntan en üstte almak istiyorsanız sadece bir satırın nasıl alınacağını söyleyebilir? – gordon

10

Bunlar farklı sorgular.

birincisi sayıda kayıt

ikincisi bir kayıt (en küçük a_datea_primary_key = 5 içinde bulunan) döndürür (a_primary_key = 5 içinde bulunan her event_id için en büyük a_date) döndürür. Farklı işlevler için

+2

o.O ilk sorgu yine de bir kayıt döndürecektir –

+1

@Shredder Sağlanan 'a_primary_key' aslında bir birincil anahtar olacaktır. Ancak, birincil anahtarsa, yalnızca "a_date" biçiminde bir tarihiniz olur ve "max" veya "top" değerine de ihtiyacınız yoktur. – GSerg

+0

Olmasa bile, yine de bir kayıt döndürür. http://www.w3schools.com/sql/sql_func_max.asp –

0

MAX ve TOP işlevleri. İlk sorgunuz, her bir farklı event_id için a_primary_key = 5 bulunan a_date için bulunan maksimum değeri döndürecektir. İkinci sorgu, sonuç kümesinde bulunan a_primary_key = 5 ile ilk a_date'u yakalayacaktır. Tablonuz endekslendiyse, performans genellikle benzerdir.

+1

İlk değeri almayacak. 'Top',' asc' ile siparişle birleştirildiğinde, en küçük değeri seçecektir. – GSerg

+0

wth, sen, bazılarını gimme kardeşim .. Bu * olacak * ilk değer bulundu ve evet, bu durumda ASC tarafından sipariş küçük beri en küçük olacak en küçük olacak, ilk değer en küçük .. –

5

ihtiyacınız olacaktır aynı sonucu olması. Tabloyu/yığın boyutunu, vb. Gibi hızı etkileyen birçok faktör vardır. Aynı veritabanının farklı sürümleri, bir sorguyu diğerinin üzerine koymak için optimize edilebilir.

+3

İlk örnekte gruplama gereği yoktur (çünkü WHERE yan tümcesi başına yalnızca bir grubunuz var). – Chains

+0

Kuru: Bir agregate işlevini w/oa grubu tarafından kullanabileceğinizden emin değilim, ancak eğer öyleyse ... haklısınız – vol7ron

+3

Yalnızca ag'leri seçtiyseniz (cevabınızdayken), iyisin. Seçime agg olmayan bir değer eklerseniz, bir gruba sahip olmanız gerekir. – Chains

0

Ben 20,00,000+ kayıtlarıyla bir masaya max ve üst gerçekleştirin ve Üst max veya min işlevinden daha tarafından emriyle hızlı vermek neden olduğunu buldu.

Yani, en iyi yol, sorgunuzu hem tek tek yürütmek hem de bağlantı süresini geçen süreden daha uzun bir süre boyunca kontrol etmektir.

İlgili konular