SSMS가 맨 아래 테이블 상단에 새 행을 삽입하는 이유는 무엇입니까?


9

SQL Server Management Studio 2008의 테이블에 행을 수동으로 삽입 할 때마다 (데이터베이스가 SQL Server 2005 임) 새 행이 맨 아래가 아닌 목록의 맨 위에 나타납니다.ID 열을 사용하고 있습니다.

id row
42 first row
1 second row
2 third row

행을 가져오고 명시 적으로 정렬하지 않은 경우이렇게하면 웹 응용 프로그램의 행을 가져와 다른 행을 변경하면 모양이 달라집니다.TOP 1쿼리가 반환됩니다.

나는 내가 할 수 있음을 안다.order by왜 그런 일이 일어나는 걸까요?대부분의 데이터는 웹 응용 프로그램을 통해 삽입됩니다.이 응용 프로그램의 모든 삽입은 선입 선출 순서로 진행됩니다. 예를 들어 최신 삽입이 맨 아래에 있으므로 ID가 모두 연속적으로 표시됩니다.이 부적절한 주문을 초래하는 서버 또는 Management Studio의 설정이 있습니까?

  0

필자가 보았던 것처럼 하나의 테이블을 선택하면 PK가 행을 표시하는 순서를 지정하는 방식에 따라 다릅니다.조인을하면 다른 테이블 PK, FK 및 인덱스에 따라 달라질 수 있습니다 ... 18 jul. 132013-07-18 22:00:36

  0

[merry-go-round] (http://technet.microsoft.com/en-us/library/ms191475%28v=sql.105%29.aspx) 검색도 알고 있어야합니다. 01 apr. 152015-04-01 03:49:03

17

SQL 세계에서 질서는 데이터 집합의 고유 한 특성이 아닙니다.따라서 RDBMS에서 특정 순서 (또는 일관된 순서)로 데이터가 반환된다는 보장은 없습니다.ORDER BY절.

에서Craig Freedman:

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

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


0

테이블이 힙 테이블 (가능성이 높음)이고 인덱싱되지 않았기 때문입니다.ID 열을 a로 지정하십시오.PRIMARY KEY만큼 잘IDENTITY.SQL Server는 인덱스를 기반으로 물리적으로 데이터를 저장합니다. 예를 들어, id가 클러스터 된 인덱스 (예 : 기본 키) 인 경우 데이터는 실제로 ID 순서대로 저장되며 데이터는 ID없이 순서대로 반환됩니다. ~ORDER BY절.그렇지 않으면 행 순서가 데이터베이스에 전혀 중요하지 않습니다.결과적으로 응용 프로그램의존하다데이터베이스의 행 순서에 따라 (뿐만 아니라 특정 순서로 된 열에 따라) 좋지 않습니다.응용 프로그램은 행을 식별하기 위해 데이터베이스에있는 키와 함 2 작업해야합니다.

  0

알아 둘만 한.나는 이것이 order by를 사용하도록 앱을 바꾸는 힌트라는 것을 알고 있었다. (그것은 나쁜 습관이 많은 상속 된 앱이다.) 그러나 나는 그것이 왜 일어 났는지 정확히 궁금해하고 있었다. 14 sep. 112011-09-14 19:49:38

+4

'ORDER BY' ***가없는'SELECT *'가 *** 올바른 순서로 돌아올 수 있도록 테이블의 구조를 변경하십시오 (그러나 여전히 보장되지는 않습니다)? 14 sep. 112011-09-14 20:22:26

  0

클러스터 된 인덱스가있는 테이블의 간단한 SELECT에서 클러스터 된 인덱스 순서대로 되돌아옵니다.데이터가 특정 열에 의해 물리적으로 정렬되는 경우를 보여 주지만 모든 쿼리에서 올바르게 반환되는 것은 아닙니다.Mea culpa. 14 sep. 112011-09-14 20:27:39

+4

클러스터 된 인덱스는 실제로 중요하지 않습니다.SQL Server는 다양한 요인에 따라 다른 인덱스를 기반으로 한 주문을 반환 할 수 있습니다.어떤 칼럼에 프라이 머리 키를 생성하는 것은 *** 칼럼에 의해 항상 순서대로 되돌아 오는 순서에 의한 선택을 보장하지 않는다.대부분의 시간을 지켜 볼 수 있습니까?확실한.그러나 그것은 보증과 동일하지 않습니다.나는 나의 거리에서 북극곰을 본 적이 없지만 그것이 일어나지 못하게하는 북극곰의 힘이 없다. 14 sep. 112011-09-14 20:41:09

+3

어쨌든 내 요점은'ORDER BY' 절을 추가하는 것이 테이블에 스키마 변경을하는 것보다 훨씬 더 나은 보장이다 (절대로 신경 쓰지 않아도 됨). 14 sep. 112011-09-14 20:42:25


10

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

다른 말로하면, 나는 당신이 이미 그 해답을 알고 있음을 알고 있지만, 충분히 말할 수는 없다.

검색어의 순서에 의존하려면 항상 추가하세요.ORDER BY .

  0

순서에 따라 계획을 세우려하지는 않았지만 시각적으로 마지막으로 삽입 한 항목이 갑자기 상단에 표시되는 것이 약간 짜증 스럽습니다. 14 sep. 112011-09-14 20:18:15

  0

오픈 테이블을 사용하고 있기 때문입니다.Management Studio 2008에서이 명령은 "Top n 행 편집"및 "상위 N 행 선택"으로 분기되었습니다. 후자를 선택하면 결과 쿼리를 자유롭게 편집 할 수 있습니다 (예 : 상단 제거 및 순서 추가). 14 sep. 112011-09-14 20:21:07

  0

그것은 관리 스튜디오 2008, 서버가 2005, 명확해야합니다.나는 "열린 테이블"명령이 있다는 것을 몰랐다. 나는 항상'select' 문장을 사용했다. 14 sep. 112011-09-14 20:36:30

+4

자, 아직 요점은 그대로입니다. 예상하지 못한 순서로 데이터가 돌아 오는 것이 짜증 스럽지만, SQL Server가 어떤 순서로 기대하는지는 분명하지 않습니다. order by 절을 추가하면됩니다.:-) 14 sep. 112011-09-14 20:37:35