Birleştirmeler kullanıldığında SQL Server sipariş sonuçları nasıl?


10

SQL Server, sorgu yürütme sonuç kümesindeki kayıtların sırasını nasıl belirler?

Ben onun kafalarını veya kuyruklarını yapmaya çalışıyorum ama kendimi başımı kaşıyor buluyorum. Alanları değiştirdiğimde siparişi de değiştiriyorum. Aşağıdaki SQL i ile yürüttüğümde SELECT *aynı kayıtları alıyorum ama çok farklı bir sırayla.

 SELECT TOP (900)
    AD.ATTACHMENTID,
    AD.NAME,
    AD.ISINLINE,
    AD.INSERTEDDATETIME,
    ATMT.ATTACHMENTBLOB,
    U.UFID
  FROM ATTACHMENTDETAIL AD WITH (NOLOCK)
  INNER JOIN MESSAGEATTACHMENT MA ON MA.ATTACHMENTID = AD.ATTACHMENTID
  INNER JOIN ATTACHMENT ATMT ON ATMT.ATTACHMENTID = AD.ATTACHMENTID
  INNER JOIN MESSAGE MSG ON MSG.ID = MA.MESSAGEID
  INNER JOIN MESSAGEDETAIL MD ON MD.MESSAGEID = MA.MESSAGEID
  INNER JOIN [USER] U ON U.ID = MD.USERID
  LEFT OUTER JOIN XmlExtractionMapping XM ON MA.MESSAGEID = XM.MessageId
    WHERE AD.FILEBOXTOKEN IS NULL 
    AND (XM.XMLEXTRACTIONDATE IS NOT NULL OR 
         (MSG.MESSAGESOURCEID = 1 AND MD.FolderId <> -4))
    AND AD.ISINLINE = 'FALSE'

6
Birkaç yorum / soru: (1) neden sadece bir masada sihirli pixie-toz turbo düğmesi NOLOCK kullanıyorsunuz? Vudu yerine RCSI kullanmayı düşündünüz mü? (2) neden uygun şema öneklerini kullanmıyorsunuz? Birincisi için web'de arama yapın NOLOCK- onu kullanmamanız için her türlü nedeni göreceksiniz. İkincisi için bkz. Sqlblog.com/blogs/aaron_bertrand/archive/2009/10/11/…
Aaron Bertrand

RCSI? lütfen açıklayın ...
kacalapy

2
RCSI = Taahhüt Edilen Anlık Görüntü İzolasyonunu Oku. Bkz. Stackoverflow.com/questions/816650/…
Aaron Bertrand

Bir ORDER BYyan tümce olmadan , SQL Server (ve diğer RDBMS) nasıl hissediyorsa onu yapar .
Nick Chammas

Yanıtlar:


17

SQL Server'a sonuçları nasıl sipariş edeceğinizi söylemediğiniz için, en verimli olanı yapmak ücretsizdir. Bu şekilde sıralamak için en ucuz olana bağlı olacaktır ve seçtiğiniz sütunlar, sorgu tarafından istenen bilgiye ulaşmak için kullanılacak en ucuz dizinlere bağlı olduğu için bunu yönlendirecektir. Bu, yalnızca sorgu metnini değiştirerek değil, aynı zamanda veri değişiklikleri, istatistik güncellemeleri, freeproccache, hizmet paketleri, düzeltmeler, vb. Gibi şeylerle yürütme işleminden yürütmeye değişebilir. , OLTP uygulamalarında olduğu gibi.

Öngörülebilir bir sipariş istiyorsanız, neden ORDER BYsorguda kullanmıyorsunuz ? Yazıldığı gibi SQL, herhangi bir sırada 900 satırın kabul edilebilir olduğunu belirtir .

Birçok durumda, aynı sorgu için aynı sırayı tekrar tekrar görseniz de, siz söylemedikçe hiçbir garanti yoktur ORDER BY <something>.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.