Oracle 19c에 ANY_VALUE 함수가 추가되었습니다. ANY_VALUE 함수는 집계 함수로 그룹에서 널이 아닌 첫 번째 값을 반환합니다. 이 함수는 첫 번째 값을 찾은 후 집계를 수행하지 않아 결과가 비결정적이고, MIN, MAX 함수보다 속도가 빠른 것으로 알려져 있습니다.
ANY_VALUE ([ DISTINCT | ALL ] expr)
테스트를 위해 아래와 같이 테이블을 생성하겠습니다.
-- 1
DROP TABLE t1 PURGE;
CREATE TABLE t1 (c1, c2) AS SELECT CEIL (ROWNUM / 1000000), CEIL (ROWNUM / 1000000) FROM XMLTABLE ('1 to 10000000');
아래 쿼리는 수행에 0.65초가 소요됩니다.
-- 2
SELECT c1, c2, COUNT (*)
FROM t1
GROUP BY c1, c2;
---------------------------------------------------------------------------------------
| Id | Operation | Name | A-Rows | A-Time | Buffers | Reads | Used-Mem |
---------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 10 |00:00:00.65 | 15224 | 15221 | |
| 1 | HASH GROUP BY | | 10 |00:00:00.65 | 15224 | 15221 | 1153K (0)|
| 2 | TABLE ACCESS FULL| T1 | 10M|00:00:00.15 | 15224 | 15221 | |
---------------------------------------------------------------------------------------
아래 쿼리는 MIN 함수를 사용하고, 수행에 0.63초가 소요됩니다.
-- 3
SELECT c1, MIN (c2), COUNT (*)
FROM t1
GROUP BY c1;
---------------------------------------------------------------------------------------
| Id | Operation | Name | A-Rows | A-Time | Buffers | Reads | Used-Mem |
---------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 10 |00:00:00.63 | 15224 | 15221 | |
| 1 | HASH GROUP BY | | 10 |00:00:00.63 | 15224 | 15221 | 1021K (0)|
| 2 | TABLE ACCESS FULL| T1 | 10M|00:00:00.15 | 15224 | 15221 | |
---------------------------------------------------------------------------------------
아래 쿼리는 ANY_VALUE 함수를 사용하고, 수행에 19.3 버전은 1.05초, 21.3 버전은 0.66초가 소요됩니다. 21c에서 성능이 개선된 것으로 보이지만 속도는 MIN 함수와 비슷한 수준입니다.
-- 4: 19.3
SELECT c1, ANY_VALUE (c2), COUNT (*)
FROM t1
GROUP BY c1;
---------------------------------------------------------------------------------------
| Id | Operation | Name | A-Rows | A-Time | Buffers | Reads | Used-Mem |
---------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 10 |00:00:01.05 | 15224 | 15221 | |
| 1 | HASH GROUP BY | | 10 |00:00:01.05 | 15224 | 15221 | 1021K (0)|
| 2 | TABLE ACCESS FULL| T1 | 10M|00:00:00.15 | 15224 | 15221 | |
---------------------------------------------------------------------------------------
-- 4-2: 21.3
----------------------------------------------------------------------------
| Id | Operation | Name | A-Rows | A-Time | Buffers | Reads |
----------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 10 |00:00:00.66 | 15225 | 15221 |
| 1 | HASH GROUP BY | | 10 |00:00:00.66 | 15225 | 15221 |
| 2 | TABLE ACCESS FULL| T1 | 10M|00:00:00.15 | 15225 | 15221 |
----------------------------------------------------------------------------
관련 링크