2013-03-06 12 views
17

msdn documentation bizSELECT TOP, herhangi bir sipariş belirtilmemişken nasıl çalışır?

SELECT TOP(N) ..... ORDER BY [COLUMN] 

yazarken Biz column

(asc veya desc seçtiğimiz şeye bağlı olarak) Ama hiç belirtmek yoksa göre sıralanır üst (n) satır olsun diyor msdn, Gail Erickson'un here'a işaret ettiği gibi random diyor. O işaret ettiği gibi o zaman randomunspecified olmalıdır. Ancak orada

TOP madde İLE SİPARİŞ birlikte kullanılır

, sonuç grubu sipariş satırları birinci N sayısı ile sınırlı olduğu Thomas Lee noktaları olarak; aksi takdirde satırların ilk N sayısı ilk bu koştum,

Yani, herhangi bir dizin olmayan bir tablo üzerinde bu sorguyu ran Ramdom döner .. sonra

SELECT * 
FROM 
    sys.objects so 
WHERE 
    so.object_id NOT IN (SELECT si.object_id 
         FROM 
          sys.index_columns si) 
    AND so.type_desc = N'USER_TABLE' 

Ve Bu tablolardan birinde, (aslında yukarıdaki sorgu ile döndürülen tüm tablolarda aşağıdaki sorguyu denedim) ve Her zaman aynı satırları aldım.

enter image description here

..

SELECT TOP (2) * 
FROM 
    MstConfigSettings 

Bu her zaman aynı 2 satır döndü ve 3 adımları gösterir aynı yürütme planları Şimdi sorgunun 1. tarafından döndürülen tüm diğer tablolar için geçerlidir yapabilirsiniz gibi bakmak, sadece saf bir tablo taraması hiçbir indeks var olduğunu görmek ve

enter image description here

Top, gerçek satır 2'yi 2 olarak gösterir ve Table Scan; Durum böyle değil (birçok satır var).

Ama

SELECT TOP (2) * 
FROM 
    MstConfigSettings 
ORDER BY 
    DefaultItemId 

gibi bir şey çalıştırdığınızda ben ORDER BY uygulanamadığı durumlarda, yürütme planı,

enter image description here

ve

Yani

enter image description here

gösteriradımlar farklıdır (çeşit yoktur). Ancak, bu TOP, Sort yok olduğunda nasıl çalışır ve neden her zaman aynı sonucu verir?

+0

Veritabanına eklendikleri tarihe kadar sipariş edildiğini düşündüm. En eski ilk. – mattytommo

+0

dbms uygulamasına bağlıdır, bu nedenle 'order' olmaksızın 'top', uygulama tanımlı bir özelliktir – AnatolyS

+0

@AnatolyS - 'TOP' standart SQL değilse ve soru SQL Server olarak etiketlenmiştir. –

cevap

19

Hangi iki satıra sahip olduğunuza dair bir garanti yoktur. Sadece tablo taramasından alınan ilk ikisi olacak.

Yürütme planındaki TOP yineleyicisi, iki kez döndürüldükten sonra satır istemek istemez.

Bir yığının taraması için, bu, ayırma sırasındaki ilk iki satır olacaktır, ancak bu garanti edilmez. Örneğin, SQL Server, advanced scanning özelliğini kullanabilir, bu da taramanızın son zamanlarda başka bir eşzamanlı taramadan okunan sayfaları okuyacağı anlamına gelir.

+0

Yani eğer bir garanti yoksa, neden her zaman aynı 2 satırı alırım? ** Her zaman? ** – Razort4x

+4

Çünkü tablo taraması her zaman aynı şekilde çalışır. Hiçbir garanti, aynı sonuçları alma olasılığınızın olmadığı anlamına gelmez. Bu sadece belirli bir siparişe güvenemeyeceğiniz ve değiştiğinde şikayet edebileceğiniz anlamına gelir. İlk tahsis edilen sayfadaki ilk iki satırı alamayacağınız tek durum, gelişmiş tarama başlatılmış olsaydı. –

+9

@ Razort4x - Sanırım karışıklığın sizin için bağlantılı sayfa. Bu yanlış. SQL Server, bilerek kasıtlı olarak rastgele sonuçlar elde etmeyecektir, sadece aldığınız ikisiyle ilgili herhangi bir söz vermez. Eğer gerçekten iki rastgele satır istediyseniz, örneğin 'NEWID() 'ile sipariş edebilirsiniz. Bu nedenle belgelerin, "tanımlanmamış" rastgele olmayan şekilde değiştirilmesi sağlandı. –