SSMS가 테이블의 맨 위에 새 행을 삽입하는 이유는 무엇입니까?


14

SQL Server Management Studio 2008 (데이터베이스는 SQL Server 2005)에서 테이블에 행을 수동으로 삽입 할 때마다 새 행이 맨 아래가 아니라 목록의 맨 위에 나타납니다. 나는 정체성 열을 사용하고 있는데 결과는 다음과 같습니다.

id  row
42 first row
1 second row
2 third row

행을 가져오고 명시 적으로 정렬하지 않은 경우 이렇게하면 웹 앱에 대해 행을 가져 와서 TOP 1쿼리가 반환 하는 내용을 변경할 때 모양이 달라 집니다.

나는 order by그들이 할 수 있다는 것을 알고 있지만 왜 이런 일이 일어나고 있습니까? 내 데이터의 대부분은 웹 응용 프로그램을 통해 삽입되며이 응용 프로그램의 모든 삽입은 선입 선출 (First In First Out) 순서로 표시됩니다. 예를 들어 최신 삽입은 맨 아래에 있으므로 ID가 모두 한 줄에 있습니다. 서버 또는 Management Studio에이 부적절한 주문을 일으키는 설정이 있습니까?


때때로 보았 듯이 단일 테이블을 선택하면 PK의 행 표시 방법에 따라 다릅니다. 조인을하면 다른 테이블 PK, FK 및 인덱스에 따라 변경 될 수 있습니다.
Guillermo Gutiérrez

의주의 회전 목마 도 검색합니다.
Michael Green

답변:


21

SQL 세계에서 순서는 데이터 집합의 고유 속성이 아닙니다. 따라서 RDBMS에서 ORDER BY조항 을 사용하여 데이터를 쿼리하지 않는 한 데이터가 특정 순서로 또는 심지어 일관된 순서로 돌아올 것이라는 보장은 없습니다 .

에서 크레이그 프리드먼 :

TOP을 ORDER BY와 결합하면 반환 된 행 집합에 결정 ​​성이 추가됩니다. ORDER BY가 없으면 반환되는 행 집합은 쿼리 계획에 따라 다르며 실행에 따라 다를 수도 있습니다.

ORDER BY결과 집합에서 명확하고 일관된 순서를 기대할 경우 항상 사용 하십시오. 쿼리에서 특정 데이터 순서를 보장하기 위해 데이터베이스가 행을 디스크에 저장하는 방법 (예 : 클러스터 된 인덱스를 통해)에 의존하지 마십시오.


13

다른 답변을 보강하기 위해 테이블은 정의되지 않은 행 집합입니다. ORDER BY절을 지정하지 않으면 SQL Server는 가장 효율적인 순서대로 행을 반환 할 수 있습니다. 대부분의 테이블에 ID, 날짜 시간 또는 기타 단조 증가 열에 대한 클러스터형 인덱스가 있기 때문에 삽입 순서와 일치하는 경우가 종종 있지만 일치하는 그대로 처리해야합니다. 새 데이터, 통계 업데이트, 추적 플래그, maxdop 변경, 쿼리 힌트, 쿼리의 조인 또는 where 절 변경, 서비스 팩 / 누적 업데이트 / 핫픽스 / 업그레이드로 인한 옵티 마이저 변경, 데이터베이스를 다른 서버로 이동하는 등

다시 말해, 이미 답변을 알고 있지만 충분히 설명 할 수는 없습니다.

쿼리 순서에 의존하려면 항상 add를 추가하십시오 ORDER BY .


나는 주문에 따라 계획하지 않았지만 시각적으로 마지막으로 삽입 된 항목이 갑자기 맨 위에 있다는 것은 약간 성가신 일입니다.
Ben Brocka

Open Table을 사용하고 있기 때문이라고 생각합니다. Management Studio 2008에서이 명령은 "상위 n 행 편집"및 "상위 N 행 선택"으로 분기되었습니다. 후자를 선택하면 결과 쿼리를 편집 할 수 있습니다 (예 : 상위를 제거하고 순서를 추가).
Aaron Bertrand

서버가 2005 인 Management studio 2008이 더 명확해야합니다. 난 항상 사용했습니다,에 "테이블 열기"명령이 몰랐 select문에서도이
벤 Brocka

4
좋아, 요점은 여전히 ​​서있다. 나는 데이터가 당신이 예상하지 않은 순서로 돌아 오는 것이 짜증나다는 것을 이해하지만, SQL Server가 왜 당신이 신경 쓰지 않는다고 말하지 않는다면 당신 이 기대하는 순서를 실제로 신경 쓰지 않는 이유가 분명하기를 바란다. order by 절을 추가하여. :-)
Aaron Bertrand

1

테이블이 힙 테이블 (대부분 가능성이 높음)이고 색인화되지 않았기 때문입니다. ID 열을 a PRIMARY KEY로 만드십시오 IDENTITY. SQL Server는 인덱스를 기반으로 데이터를 물리적으로 저장합니다. 예를 들어, id가 기본 키와 같은 클러스터형 인덱스 인 경우 데이터는 물리적으로 ID 순서대로 저장되며 쿼리 없이도 그런 식으로 반환됩니다 ORDER BY절. 그렇지 않으면 행 순서가 데이터베이스에 전혀 중요하지 않습니다. 따라서, 애플리케이션을 갖는 의존 하여 데이터베이스 내의 행의 순서 (및 특정 순서로되는 컬럼에 따라)에 것은 좋은 방법이 아닙니다. 응용 프로그램은 행을 식별하기 위해 데이터베이스에있는 모든 키로 작업해야합니다.


알아 둘만 한. 나는 이것이 사용하도록 응용 프로그램을 변경하는 힌트라는 것을 알았습니다 order by(많은 나쁜 습관을 가진 상속 된 응용 프로그램입니다).하지만 왜 그런 일이 일어 났는지 궁금합니다.
벤 Brocka

5
테이블 구조를 변경 SELECT *하지 않고 "오른쪽"순서로 돌아올 ORDER BY 있지만 여전히 보장되지는 않습니까?
Aaron Bertrand

클러스터 된 인덱스가있는 테이블의 간단한 SELECT에서 클러스터 된 인덱스의 순서로 돌아옵니다. 데이터가 특정 열에 의해 물리적으로 데이터가 정렬되는 시점을 보여 주 었음이 분명하지는 않았지만 모든 쿼리에서 올바르게 반환되는 것은 아닙니다. Mea Culpa.
Wil

5
클러스터형 인덱스가 무엇인지는 중요하지 않습니다. SQL Server는 여전히 다양한 요인에 따라 다른 인덱스를 기반으로 순서를 반환 할 수 있습니다. 일부 열에 기본 키를 생성 하지 않습니다 갑자기 다시 항상 열을 기준으로 정렬 올 것이다 없음 순서가 선택을 보장합니다. 대부분의 시간을 관찰 할 수 있습니까? 확실한. 그러나 이것은 보증과는 다릅니다. 나는 내 거리에서 북극곰을 본 적이 없지만 북극곰의 힘 장은 없습니다.
Aaron Bertrand

4
어쨌든 내 요점은 ORDER BY절 을 추가하는 것이 테이블을 스키마로 변경 하고 순서가 원하는대로 영원히 있기희망 하는 것보다 훨씬 더 나은 보장 ( 아마도 덜 무시할 염려가 없음) 이라는 것입니다.
Aaron Bertrand
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.