조인을 사용할 때 SQL Server의 결과 결과는 어떻습니까?


10

SQL Server는 쿼리 실행 결과 집합에서 레코드 순서를 어떻게 파악합니까?

나는 머리 또는 꼬리를 만들려고 노력하고 있지만 내 머리를 긁적입니다. 필드를 변경하면 순서를 선택하는 것도 변경됩니다. 아래 SQL을 사용 SELECT *하여 동일한 레코드를 얻지 만 훨씬 다른 순서로 얻습니다.

 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
몇 가지 의견 / 질문 : (1) 왜 하나의 테이블에만 마술 픽스 더스트 터보 버튼 NOLOCK을 사용합니까? 부두 대신 RCSI 사용을 고려 했습니까? (2) 왜 적절한 스키마 접두사를 사용하지 않습니까? 전자의 경우 웹을 검색하십시오. 웹을 NOLOCK사용하지 않아야하는 모든 이유를 알 수 있습니다. 후자에 대해서는 sqlblog.com/blogs/aaron_bertrand/archive/2009/10/11/…를
Aaron Bertrand

RCSI?
kacalapy

2
RCSI = 커밋 된 스냅 샷 격리 읽기. 참조 stackoverflow.com/questions/816650/...
아론 버트 랜드

ORDER BY절이 없으면 SQL Server (및 기타 RDBMS) 는 원하는대로 작업합니다 .
Nick Chammas

답변:


17

SQL Server에 결과를 주문하는 방법을 알려주지 않았으므로 가장 효율적인 방법으로 자유롭게 주문할 수 있습니다. 이런 식으로 정렬하는 것이 가장 저렴한 항목에 따라 달라지며, 선택한 열은 쿼리에서 요청한 정보를 얻는 데 사용할 가장 저렴한 인덱스에 의존하기 때문에 선택하는 열을 사용합니다. 이것은 쿼리 텍스트를 변경하는 것뿐만 아니라 데이터 변경, 통계 업데이트, freeproccache, 서비스 팩, 핫픽스 등과 같은 것들에 의해 실행에서 실행으로 변경 될 수 있습니다. 이것은 기본 데이터가 급격히 변화하는 경우 관련된 테이블이 많을 때 특히 변동이 심합니다. OLTP 응용 프로그램 에서처럼 경향이 있습니다.

예측 가능한 순서를 원한다면 왜 ORDER BY쿼리에 사용하지 않습니까? 기록 된 바와 같이, SQL의 지정은 임의의 900 행은 어떤 순서로 허용된다.

많은 경우에 동일한 쿼리에 대해 동일한 순서를 반복해서 볼 수 있지만을 말하지 않으면 보장 할 수 없습니다 ORDER BY <something>.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.