2013-04-28 4 views
0

오라클에 새로 입문했습니다.오라클 SQL 쿼리 실행 순서

http://sqlfiddle.com/#!4/a7b7c/1

가 궁금 방법 쿼리 : : 그리고 테이블과 여기에 몇 가지 질문이

select distinct name,id from test; 

같은 출력을 생성

select name,id from test group by name,id; 

. oracle에서 위의 쿼리가 실행되는 순서를 어떻게 찾을 수 있습니까? 모든 데이터에 대해 무작위로? 또는 모든 데이터 세트에 대해 실행되는 방법이 있습니다. 디버그 성능을 원하는 경우

답변

1

일반적으로는 그렇게 같은 계획을 설명하는 사용하십시오 :

을 계획을 EXPLAIN TEST 구별 이름, ID 을 선택;

TEST GROUP BY (NAME, ID) 발 SELECT NAME, ID 계획을 EXPLAIN;

쿼리 최적화 프로그램이 가장 잘한다고 생각하는 처리 방법을 보여주기 때문에 항상 동일한 계획을 얻을 수 있다고 보장 할 수 없습니다. 예를 들어 인덱스를 추가하면 계획이 변경 될 수 있지만 힌트를 사용할 수는 있습니다. 실제로 사용 된 것으로 생각합니다.

1

모든 쿼리가 동일한 결과를 생성하는 이유는 테이블에 고유 한 값이 있기 때문입니다.

"그룹 기준"을 사용하는 것은이 경우에 적합하지 않습니다. 집계 또는 합계 (또는 다른 수학 연산)를 원할 때는 "그룹 기준"을 사용하십시오. 예를 들면 다음과 같습니다.

이렇게하면 테이블에 이름이 표시됩니다.

출력 순서 : Oracle은 지시 될 때까지 임의의 순서로 행을 리턴합니다.

select name,id from test order by name, id; 

그럼 당신은 결과를 이름순으로 정렬 반환됩니다 보장 : 그래서 특정 순서를 지정하려면 다음과 같이 절 "에 의해 순서"를 사용합니다. 이름이 두 번 이상 나오면 이드가 명령 할 것입니다.

1

위의 쿼리가 실행되는 순서를 어떻게 알 수 있습니까? 모든 데이터에 대해 무작위로? 또는 모든 데이터 세트에 대해 실행되는 방법이 있습니다. 하나는 명시 적으로 order by 절을 사용하여 요청하지 않는 한

는 SQL에서 행이 결정되는 순서는 지정입니다. (그렇지 않다면, 당신은 그들이 검색어와 일치하는 것을 발견하고 순서대로 행을 얻을 것이다, 그들은 쿼리 계획에 따라 달라질 수있는.)

을 [쿼리가 있습니다]를 같은 생산 출력.

여기에 ID가 있기 때문입니다. 아마, 그들은 모두 실제 스키마에서 주요 키로 구분되고 표시되어있을 것입니다.

distinct, btw는 group by이며 모든 의도와 목적에 따라 검색된 모든 필드입니다.

어쨌든 일관되게 행을 원한다면 order by name, id과 같은 것이 좋습니다.

1

SQL Fiddle : 테이블에 5 개의 레코드가 있으며 NAME과 ID의 5 가지 조합이 있습니다. 따라서 게시 한 쿼리는 모든 행을 반환합니다. 효과적으로 그들은 단지 데이터베이스가 고유성을 보장 할 의무를 보잘것없는 종류의 여분의 자원 소비와 ... ...이 쿼리로

select name, id from test; 

를 동일합니다. NAME과 ID가 중복되었지만 다른 EMAIL이있는 새 레코드를 추가하면 무슨 일이 일어나는지 이해하는 데 도움이됩니다. 절은 고유 결과 집합을 생성하는 데 충분해야 WHERE 제대로 정의 :

당신은 DISTINCT 사용하는 것이 실제로 현실에서 매우 드문 것을 이해해야한다. GROUP BY는 일반적으로 COUNT() 또는 SUM()과 같은 집계 함수와 함께 사용됩니다. 예를 들어 NAME + ID에 EMAIL이 둘 이상 있습니까?

select name, id from test 
group by name, id having count(*) > 1; 

주문의 경우 실행 된 쿼리는 정렬이 필요하므로 결과 집합의 순서는 입력 순서와 다를 수 있습니다. 오라클은 결과 집합의 순서를 보장하지 않지만 정렬을 수행하면 예측 가능성이 낮아집니다. 그 보증을 얻으려면이 ORDER BY 절을 지정해야합니다 :

select distinct name, id from test 
order by name, id 

그 결과 세트에 관계없이 필터링 할 때 다른 처리가 발생 무엇인지, 어떤 문 같은 순서를 보장하고 처리 할 ORDER BY 절.