2010-01-02 9 views
2

이러한 명령문 사이에 명백한 차이 (속도/효율성)가 있습니까? 열의 인덱스가 있다고 가정합니다. 계획을 설명에 따라열의 최대 값 얻기

SELECT MAX(someIntColumn) AS someIntColumn 

또는

SELECT someIntColumn ORDER BY someIntColumn DESC LIMIT 1 

답변

6

이는 주로 SQL 구현의 쿼리 최적화 프로그램에 달려 있습니다. 기껏해야, 그들은 동일한 성능을 가질 것입니다. 그러나 일반적으로 첫 번째 쿼리는 잠재적으로 훨씬 빠릅니다.

첫 번째 쿼리는 기본적으로 DBMS에 someIntColumn의 모든 값을 검사하고 가장 큰 값을 선택하도록 요청합니다.

두 번째 쿼리는 DBMS에게 someIntColumn의 모든 값을 최대 값에서 최소값으로 정렬하고 첫 번째 값을 선택하도록 요청합니다. 테이블에있는 행 수와 열에 대한 색인의 존재 (또는 부족)에 따라 상당히 느려질 수 있습니다.

쿼리 최적화 프로그램이 두 번째 쿼리가 첫 번째 쿼리와 동일하다는 것을 알기에 충분히 정교하면 운이 좋습니다. 그러나 앱을 다른 DBMS에 재 타겟팅하면 예기치 않게 성능이 저하 될 수 있습니다.

+2

나는 이것에 동의한다. MAX()는 DBMS에게 명확한 목표와 그 경우에 적용되는 최적화 (예 : 열이 더 많이 삽입되는 경우에만 업데이트되는 초고속 "최대"조회)를 사용하는 기회를 제공합니다. 두 번째 명령은 시스템이 의도적으로 이해하기 어렵고 최적화하기가 더 어려울 수 있습니다. –

0

편집 :

이 계획 설명은 max(column)이 더 효율적임을 보여줍니다. 설명 계획은 “Select tables optimized away”입니다.

EXPLAIN SELECT version from schema_migrations order by version desc limit 1; 
+----+-------------+-------------------+-------+---------------+--------------------------+---------+------+------+-------------+ 
| id | select_type | table    | type | possible_keys | key      | key_len | ref | rows | Extra  | 
+----+-------------+-------------------+-------+---------------+--------------------------+---------+------+------+-------------+ 
| 1 | SIMPLE  | schema_migrations | index | NULL   | unique_schema_migrations | 767  | NULL | 1 | Using index | 
+----+-------------+-------------------+-------+---------------+--------------------------+---------+------+------+-------------+ 
1 row in set (0.00 sec) 

EXPLAIN SELECT max(version) FROM schema_migrations ; 
+----+-------------+-------+------+---------------+------+---------+------+------+------------------------------+ 
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra      | 
+----+-------------+-------+------+---------------+------+---------+------+------+------------------------------+ 
| 1 | SIMPLE  | NULL | NULL | NULL   | NULL | NULL | NULL | NULL | Select tables optimized away | 
+----+-------------+-------+------+---------------+------+---------+------+------+------------------------------+ 
1 row in set (0.00 sec) 
+0

맞습니다.이 단일 열 값을 검색하는 것임을 명확히해야한다고 가정 해보십시오. – Thody

+0

예. myISAM은 인덱싱 된 열에서 요약 결과를 반환하는 것이 빠릅니다. 그것은 사용 가능한 방식으로 요약 데이터를 유지 보수합니다. –