2014-09-19 4 views
1

현재 일부 아이디어를 긁어 내기 위해 AdventureWorks 예제 데이터베이스와 LinqPad를 사용하고 있습니다.Linq 결과가 다른 순서로 표시됩니다.

SalesOrderHeaders.GroupBy (soh => new {soh.CustomerID, soh.BillToAddressID}) 
       .Where(soh => soh.Skip(1).Any()) 
       .Dump(); 

아이디어는 몇 가지 기준에 따라 중복을 찾은 다음 데이터의 첫 번째 세트를 제외하고이를 표시하는 것이 었습니다 :

이 문제의 쿼리입니다. 결과는 테이블에서 삭제되어야합니다.

쿼리를 실행 한 후 나는 내가 쿼리의 올바른 결과에 대한 상관 없어 결과 B) enter image description here

를 얻을 결과 A) First Result

쿼리를 다시 실행 한 후 얻을 수 있지만, 대한 결과 집합의 순서. 이 두 가지 가능성 만 존재하며 쿼리의 모든 실행마다 대체됩니다. 분명히 Key가 주문할 수는 있습니다 만, 왜 이런 일이 발생하는지에 더 관심이 있습니까? 주문이 찬/교대하는 이유는 무엇입니까?

+1

사용자가 기대하는 다른 이유가 없거나 행 사이에 논리적 순서가 없더라도 사용자에게 표시되는 데이터를 주문해야한다는 일반적인 원칙이 있습니다. (물론, LINQPad 및 SSMS와 같은 개발자 도구에는 적용되지 않습니다.) –

답변

6

SQL 서버 선택 쿼리의 결과 집합 순서가 결정적이지 않습니다. 그것은 SQL Server가 작동하는 방식이며 linq 또는 linqpad에서 버그가 아닙니다. 귀하가 언급 한 것처럼 결정적인 결과를 얻는 유일한 방법은 OrderBy 절을 사용하는 것입니다.

편집 : 쿼리를 여러 번 실행하면 SSMS에서 동일한 결과가 나타나는 것에 대해서는 this을 참조하십시오. 이 게시물은 쿼리를 여러 번 실행하고 왜 쿼리를 사용하지 않는지 동일한 결과를 얻을 수있는 이유를 설명합니다.

+0

방금 ​​찾은 또 다른 해결 방법이 있습니다. 생성 된 SQL 코드를 가져 와서 SSMS에서 실행하십시오. 그런 다음 주문이 설정됩니다. 하지만 왜 3, 4, 5가 아닌 2 가지 다른 결과가 있습니까? – Marco

+0

SSMS는 일부 고유 한 행 ID/데이터 ID를 사용하여 데이터를 내부 순서대로 처리한다고 생각합니다. 따라서 모든 SELECT 문에 대해 동일한 순서의 행을 여러 번 실행할 수 있습니다. 프로그래밍 패러다임에서 공급자를 통해 가져온 데이터의 경우 이러한 내부 순서가 없습니다. 또한 주문 수는 레코드 수가 많으면 더 높은 주문 불확실성을 보게 될 경우 사용자가 가져온 행 수에 따라 달라집니다. –

1

정렬 순서는 이전에 제안한대로 결코 결정적이지 않지만 SQL 쿼리 나 Linq 쿼리에 orderby 절을 삽입하여 결정적으로 만들 수있는 유일한 방법입니다.

실제로 데이터베이스에서 조금 더 자세히 보겠습니다. DB는 I/O를 통해 디스크의 모든 데이터를 가져옵니다. 데이터는 페이지, 익스텐트, 세그먼트와 같은 내부 SQL 서버 구조에 저장됩니다 (이것들은 오라클 데이터 블록이며, SQL 서버가 비슷한 것을 갖기를 바랍니다). 이제 질의가 실행되면 데이터베이스는 데이터를 가져올 다른 위치를 모두 알 수 있지만 직렬 작업이 아니라 병렬 가져 오기의 일종이며 다른 데이터 세트가 결합되어 사용자보기를 제공합니다. 이제 스레드의 경우에서 알 수 있듯이 누가 먼저 가고 누가 먼저 리턴하는지 결정적 일 수는 없습니다. 스레드의 OS 스케줄링이 전부입니다.

OrderBy 절은 가져온 데이터를 특정 순서로 만들기 때문에 항상 결정적인 결과를 산출합니다.