2011-08-25 2 views
25

몇 가지 코드를 검토하고 다른 사람이 한 일에 직면했으며 내 이유가 더 좋다고 생각할 수 없습니다. 그리고 그것은 아마도 그렇지 않습니다, 그래서, 어느 쪽이 더 낫고/더 안전하고/더 효능이 있습니까?MAX 대 1 위 - 어떤 것이 더 좋습니까?

SELECT MAX(a_date) FROM a_table WHERE a_primary_key = 5 GROUP BY event_id 

또는 내가 두 번째 옵션을 갈 것

SELECT TOP 1 a_date FROM a_table WHERE a_primary_key = 5 ORDER BY a_date 

하지만 이유는 잘 모르겠습니다, 그리고 맞아합니다.

답변

13

테이블의 색인이 생성되는 경우 성능은 일반적으로 비슷합니다.

가치하지만 고려 : 당신이 당신의 결과를 주문하는 경우 Top은 보통 의미가 있습니다 (? 그렇지 않으면, 무엇top) 결과를 주문

은 더 많은 처리가 필요합니다.

민이 항상 주문할 필요는 없습니다. (그냥 의존하지만, 자주 주문이나 그룹별로 주문할 필요가 없음)

두 가지 예에서 속도/x 계획이 매우 유사 할 것으로 기대합니다. 당신은 항상 당신의 통계로 확신 할 수 있지만, 나는 그 차이가 중요 할 것이라고 생각하지 않습니다.

SELECT MAX(a_date) FROM a_table WHERE a_primary_key = 5 

SELECT TOP 1 a_date FROM a_table WHERE a_primary_key = 5 ORDER BY a_date DESC 

빠르게 알 수있는 가장 좋은 방법은 쿼리 계획을 확인하고 벤치 마크를하는 것입니다 : 쿼리에 대한

+1

SQL Server TOP 1은 rowNum = 1을 사용하는 Oracle과 다르게 동작합니다. 오라클은 실제로 주문 전에 먼저 발견 한 것이므로이 방법은 SQL Server에만 유효합니다. 이 TOP 1 대 Max()의 또 다른 이점은 해당 주문을 포함하는 한 원하는만큼의 열을 확보 할 수 있다는 것입니다. Max()를 사용하여 테스트 한 결과 GROUP BY를 사용해도 단 하나의 레코드 만 생성되지는 않는다고 판명되었습니다. 아마도 강한 모조 인 누군가가 서브 쿼리를 사용하지 않고 여러 열에서 최상위를 가져 오려면 한 행만 얻는 방법을 말할 수 있습니까? – gordon

10

다른 검색어입니다.

첫 번째는 많은 레코드

두 번째는 하나 개의 레코드를 (작은 a_datea_primary_key = 5 내에서 발견) 반환 (a_primary_key = 5 내에서 발견 된 각 event_id의 가장 큰 a_date)을 반환합니다.

+2

o.O 첫 번째 쿼리는 여전히 하나의 레코드를 반환합니다. –

+1

@ Shredder 제공된 'a_primary_key'는 실제로 기본 키입니다. 하지만 기본 키인 경우 'a_date'에 날짜가 하나뿐이므로 '최대'또는 '상단'이 필요하지 않습니다. – GSerg

+0

그렇지 않은 경우에도 여전히 하나의 레코드를 반환합니다. http://www.w3schools.com/sql/sql_func_max.asp –

0

MAXTOP은 다르게 기능합니다. 첫 번째 쿼리는 a_date에 대해 발견 된 최대 값을 반환합니다.이 값은 각각 event_id에 대해 a_primary_key = 5입니다. 두 번째 쿼리는 결과 집합에있는 a_primary_key = 5으로 첫 번째 a_date을 가져옵니다.

+1

첫 번째 값을 가져 오지 않습니다. 'Top'은'order by asc'와 결합하여 가장 작은 값을 선택합니다. – GSerg

+0

wth 당신은 담배를 피우고 있습니다. 그 중 일부는 내놔. * 첫 번째 값을 잡을 것입니다. 그렇습니다. ASC에 의한 순서가 가장 작은 값에서 가장 큰 값으로 바뀌므로이 값이 가장 작을 것입니다. .. –

5

는 당신이 필요로하는 것과 같은 결과를 가지고 있습니다. 테이블/힙 크기와 같은 속도에 영향을주는 많은 요소가 있습니다. 동일한 데이터베이스의 다른 버전조차도 다른 쿼리보다 한 쿼리를 선호하도록 최적화 될 수 있습니다.

+3

첫 번째 예에서 그룹화 할 필요가 없습니다 (WHERE 절당 하나의 그룹 만 있기 때문에). – Chains

+0

@kuru : W/OA 그룹을 사용하여 집계 함수를 사용할 수 있는지 확신 할 수 없지만 그렇다면 ... – vol7ron

+3

대답을 선택할 때만 aggs를 선택하는 한 너 괜찮아. 선택 항목에 non-agg 값을 포함 시키면,에 의해 그룹이 필요합니다. – Chains

28

1) 하면 거의 동일한 성능을 가질 것이다 조회 될 테이블 및 컬럼에 클러스터 된 인덱스, 모두 MAX() 연산자 쿼리 SELECT TOP 1이있다.

2) 테이블에 클러스터 된 인덱스이없고 쿼리 할 열이있는 경우 MAX() 연산자가 더 나은 성능을 제공합니다.

참조 : http://www.johnsansom.com/performance-comparison-of-select-top-1-verses-max/

0

I가 20,00,000+ 레코드가 하나 개의 테이블에 최대 및 상부를 수행하고 최고 최대 또는 최소 기능 이상에 의해 주문를 빠르게 제공 발생하였습니다.

따라서 가장 좋은 방법은 쿼리를 하나씩 실행하고 몇 시간 동안 연결 경과 시간을 확인하는 것입니다.

관련 문제