[SQL] 기본 정렬 순서를 다루는 SQL 모범 사례
SQL기본 정렬 순서를 다루는 SQL 모범 사례
개발자가 기본 정렬 순서는 항상 보유하고 있다고 가정처럼 내가 읽은 SQL 코드의 많은 것 같습니다. 예를 들어 ORDER BY 절을 발행하지 않고 테이블에서 HTML을 선택 그들은 단지 ID를 선택 할 목록, 이름을 만들 때.
내 자신의 경험에서 BY 절에는 ORDER가 주어지지와 인덱스 경우 FIFO를 사용하여 DBMS 항상 곁에 주문 데이터처럼 보인다. 그러나, 순서는 보장되지 않습니다. 하지만 데이터 테이블이 경우 어떤 변화를 재정렬 DBMS를 본 적이 없다.
혹시 테이블에 변화가없는 경우 비 결정적 순서로 데이터를 선택하는 DBMS를 경험 한 적이 있습니까?
항상 ORDER BY 절을 넣어 가장 좋은 방법은 있습니까?
해결법
-
==============================
1.디폴트 정렬 순서가 없습니다. 테이블이 클러스터 된 인덱스가하더라도, 당신은 순서대로 결과를 얻을 보장되지 않습니다. 특정 순서를 원하는 경우 order by 절을 사용해야합니다.
디폴트 정렬 순서가 없습니다. 테이블이 클러스터 된 인덱스가하더라도, 당신은 순서대로 결과를 얻을 보장되지 않습니다. 특정 순서를 원하는 경우 order by 절을 사용해야합니다.
-
==============================
2.정렬 순서를 지정하지 않은 경우 다른 포스터가 언급으로, SQL 표준은 결과가 무엇에 쿼리 프로세서는 대부분의 편법하고 효율적인을 찾아 주문이 될 수 있다고 말한다.
정렬 순서를 지정하지 않은 경우 다른 포스터가 언급으로, SQL 표준은 결과가 무엇에 쿼리 프로세서는 대부분의 편법하고 효율적인을 찾아 주문이 될 수 있다고 말한다.
하자는 더 인덱스와 기본 키가없는 고객 테이블의 모든 행에 대한 간단한 정렬되지 않은 SELECT을 말한다. 이 쿼리 프로세서가 직선 테이블 스캔을하고 원래 (당신이 본 FIFO 동작을 제공) 삽입 된 순서대로 열을 생산하는 것, 심지어 가능성이 매우 가능합니다.
당신이 다음 (순서대로) 국가 및 도시 필드에 대한 인덱스, 다음 쿼리의 WHERE STATE = 'NY'를 추가하는 경우 쿼리 프로세서는 주를 위해 = 'NY'가 아니라에 인덱스 항목을 스캔하는 것이 더 효율적입니다 결정할 수 있습니다 전체 테이블 스캔을한다. 이 경우는 아마 STATE의 행, CITY 순서를 실현한다.
심지어이 확실하지 않다. (데이터베이스가 알바니 기반 장비 임대 사업을 위해 어쩌면 때문에) 쿼리 프로세서가 테이블에있는 거의 모든 상태 값이 'NY'임을 보여주는 통계를 수집 한 경우 예를 들어, 테이블 스캔이 실제로 싼 것을 결정할 수있다 인덱스 스캔보다, 당신은 다시 FIFO를 볼 수 있습니다.
그것은 당신의 데이터베이스가 쿼리를 계획하는 방법에 대한 몇 가지 기본을 배울 수있는 좋은 아이디어입니다. 당신은 당신의 DBMS가 크기 순서에 의해 일부의 경우, 쿼리를 최적화하기 위해 이것을 사용 후 특정 쿼리를 실행하고, 얼마나보기 위해 문을 EXPLAIN 사용할 수 있습니다. 이 배울 수있는 매력적이고 유용한 영역입니다.
-
==============================
3.당신은 데이터가 지속적으로 주문 나올하려면, 예 - 당신은 ORDER BY를 사용해야합니다.
당신은 데이터가 지속적으로 주문 나올하려면, 예 - 당신은 ORDER BY를 사용해야합니다.
-
==============================
4.예. 주문 BY 없이는 "기본 순서"이 존재하지 않는다, 당신은 FIFO / LIFO 또는 다른 순서로 데이터를 다시 얻을 것이다 것이라는 보장은 없습니다.
예. 주문 BY 없이는 "기본 순서"이 존재하지 않는다, 당신은 FIFO / LIFO 또는 다른 순서로 데이터를 다시 얻을 것이다 것이라는 보장은 없습니다.
지금까지 개발자로 "테이블에서 SELECT ID, 이름"을 사용하여, 그들은 하나 무능 중이거나 그들에 어떤 순서로 아무것도 나타납니다 상관하지 않습니다.
-
==============================
5.심각한 RDBMS는 BY 명시 적 ORDER를 지정하지 않는 한 임의의 순서를 보장하지 않습니다.
심각한 RDBMS는 BY 명시 적 ORDER를 지정하지 않는 한 임의의 순서를 보장하지 않습니다.
다른 건 순수한 행운이나 일화 - 당신은 순서를 원하는 경우, 당신은 ORDER BY를 지정할 필요가 없습니다 - 그 주위에 방법을.
-
==============================
6.당신이 데이터를 정렬하려면, 보증 무엇이든 할 수있는 유일한 방법 ORDER BY 절을 포함하는 것입니다 (모든 주요 RDBMS 시스템과는 확실히는 SQL 서버와 오라클, 알고 있어요 있음). FIFO는 ORDER BY 절없이 반환 된 주문 데이터와는 전혀 무관하고, 기본 정렬 순서의 어떤 종류의 개념이 없다. 소위 기본 정렬 순서는 기본적으로 그러나 엔진 도착 될 수있는 데이터, 문자 그대로 인덱스, 캐시 된 데이터 동시 실행 쿼리, 서버의 부하 등 등을 기반으로 임의의 순서
당신이 데이터를 정렬하려면, 보증 무엇이든 할 수있는 유일한 방법 ORDER BY 절을 포함하는 것입니다 (모든 주요 RDBMS 시스템과는 확실히는 SQL 서버와 오라클, 알고 있어요 있음). FIFO는 ORDER BY 절없이 반환 된 주문 데이터와는 전혀 무관하고, 기본 정렬 순서의 어떤 종류의 개념이 없다. 소위 기본 정렬 순서는 기본적으로 그러나 엔진 도착 될 수있는 데이터, 문자 그대로 인덱스, 캐시 된 데이터 동시 실행 쿼리, 서버의 부하 등 등을 기반으로 임의의 순서
이 다른 유래 스레드는 기본적으로 SQL Server에 관련하여 동일한 개념을 덮고, AlexK는 동작을 보여주기 위해 REPO를 블로그.
-
==============================
7.테이블에서 SELECT 같은 심지어 간단한 쿼리는 ... 다양한 순서로 데이터를 반환 할 수 있습니다. 나는이 실제로 사실을 알고,이 이론에서 사실로 알고 있고, 순서가 데이터 변경 테이블에서 발생없는 경우에도 후속 실행 사이에 변경 될 때 나는 경우를 많이 보았다.
테이블에서 SELECT 같은 심지어 간단한 쿼리는 ... 다양한 순서로 데이터를 반환 할 수 있습니다. 나는이 실제로 사실을 알고,이 이론에서 사실로 알고 있고, 순서가 데이터 변경 테이블에서 발생없는 경우에도 후속 실행 사이에 변경 될 때 나는 경우를 많이 보았다.
쿼리 병렬 계획을 사용하여 실행될 때 실행 간의 순서 변경의 전형적인 예이다. 기본 스레드를 병렬로 생성 연산자는 데이터를 리턴하기 때문에, 결과의 행의 순서는 각각의 실행 사이에서 변한다. 이러한 상황은 예를 들어 답례 때마다 실행 격렬하게 다른 결과를도 간단한 선택을합니다.
-
==============================
8.레코드 세트는 동적 정렬이 지원하는 "클라이언트 측"격자 형 제어 등으로 표시되기 때문에 SQL 내 경험에 의하면, 대부분의 시간에 나는, SQL에 의해 질서를 지정하지 않은 - SQL에 의해이 경우 순서에 어쨌든 클라이언트 측을 확인하므로 필요도 없다.
레코드 세트는 동적 정렬이 지원하는 "클라이언트 측"격자 형 제어 등으로 표시되기 때문에 SQL 내 경험에 의하면, 대부분의 시간에 나는, SQL에 의해 질서를 지정하지 않은 - SQL에 의해이 경우 순서에 어쨌든 클라이언트 측을 확인하므로 필요도 없다.
동일한 쿼리가 다른 순서에서 다른 장소에 데이터를 표시하는 데 사용할 수 있기 때문에 이것은 또한 클라이언트 측 이루어집니다.
따라서 그것은 ORDER BY에 넣어 만 가장 좋은 방법은, 때
전단 현상이 될 것 경우, 즉 그 가능성 전체적인 처리 시간을 단축하도록 어쨌든 후, 소용이없는 "재 분류".
-
==============================
9.아마도 그 SQL 쿼리의 작가 넌 독서는 반환 된 데이터의 순서에 대해 걱정하지 않는다. 가장 좋은 방법은 당신이 반환 된 결과의 순서를 보장하기 위해 필요로하는 곳에 사용하는 것입니다!
아마도 그 SQL 쿼리의 작가 넌 독서는 반환 된 데이터의 순서에 대해 걱정하지 않는다. 가장 좋은 방법은 당신이 반환 된 결과의 순서를 보장하기 위해 필요로하는 곳에 사용하는 것입니다!
-
==============================
10.누군가가 내가 한로 사용하려는 경우 나는 경우에이 쓰고 있어요.
누군가가 내가 한로 사용하려는 경우 나는 경우에이 쓰고 있어요.
글쎄, 난 만족 기본 정렬 순서를 얻고,하자 지수에 종류와 로그 테이블에 대해 말한다. 예를 들어 나는 순서로 날짜 시간 DESC을 할 수 있도록 로그 테이블 (LIFO)의 마지막 행에서 일반적으로 관심이 있어요. 또한 기본 키 옆에있는 다른 필드 (정수)에 인덱스를 추가하는 재미를 위해 시도하고 일했다.
CREATE TABLE [dbo].[tableA]([DateTime] [datetime] NOT NULL, CONSTRAINT [PK_tableA] PRIMARY KEY CLUSTERED ([DateTime] DESC) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]) ON [PRIMARY]
또는 SSMS에서 ...
from https://stackoverflow.com/questions/1793147/sql-best-practice-to-deal-with-default-sort-order by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] COUNT (*)는 항상 결과를 반환합니까? (0) | 2020.03.20 |
---|---|
[SQL] EXCEPT SELECT * (0) | 2020.03.20 |
[SQL] ON 절에서 MySQL을 알 수없는 열 (0) | 2020.03.20 |
[SQL] SQL 서버에서 날짜로 변환 VARCHAR (0) | 2020.03.20 |
[SQL] 어떻게 자바 준비된 문장 삽입에 대한 테이블 이름 변수를 사용하여 [중복] (0) | 2020.03.20 |