IT

오라클 고유 수행 정렬

itgroup 2023. 9. 20. 20:16
반응형

오라클 고유 수행 정렬

DISTINCT에서 성적이 떨어지고 있습니다.설명 계획은 제대로 들리지 않는 SORT(그룹 바이)를 수행하고 있음을 나타냅니다.저는 어떤 종류의 해시 집합이 훨씬 더 좋은 결과를 낼 것으로 기대합니다.oracle에게 정렬이 아닌 DISTINCT에 해시를 사용하도록 지시할 힌트가 있습니까?비슷한 상황에서 /*+ USE_HASH_AGGREGATION */을 사용해 보았지만 DISTINCT에서는 작동하지 않습니다.

그래서 이것이 제 원래 질문입니다.

SELECT
count(distinct userid) n, col
FROM users
GROUP BY col;

사용자는 30M 행을 가지고 있으며, 각 사용자 ID는 12번입니다.이 쿼리는 70초가 걸립니다.

이제 우리는 그것을 다음과 같이 씁니다.

SELECT
count(userid) n, col
FROM
(SELECT distinct userid, col FROM users)
GROUP BY col

그리고 40초가 걸립니다.이제 정렬 대신 해시를 수행하도록 힌트를 추가합니다.

SELECT
count(userid) n, col
FROM
(SELECT /*+ USE_HASH_AGGREGATION */ distinct userid, col FROM users)
GROUP BY col

10초가 걸립니다.

누군가가 왜 이런 일이 일어나고 있는지 또는 첫 번째 간단한 질문을 이겨서 세 번째 질문만큼 잘 작동할 수 있는 방법을 설명해 준다면 정말 좋을 것 같습니다.
제가 쿼리 단순화에 신경쓰는 이유는 이러한 쿼리가 실제로 생성되기 때문입니다.

계획: 1) 느린 속도:

----------------------------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation      | Name          | Starts | E-Rows | A-Rows |   A-Time   | Buffers | Reads  |  OMem |  1Mem | Used-Mem | Used-Tmp|
--------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |               |      1 |        |      5 |00:01:12.01 |     283K|    292K|       |       |      |     |
|   1 |  SORT GROUP BY     |               |      1 |      5 |      5 |00:01:12.01 |     283K|    292K|   194M|   448K|  172M (0)|   73728 |
|   2 |   TABLE ACCESS FULL| USERS |      1 |     29M|     29M|00:00:08.17 |     283K|    283K|       |       |      |     |

2) 빠름

--------------------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation        | Name          | Starts | E-Rows | A-Rows |   A-Time   | Buffers | Reads  |  OMem |  1Mem | Used-Mem |
--------------------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT     |               |      1 |        |      5 |00:00:13.09 |     283K|    283K|   |   |      |
|   1 |  SORT GROUP BY       |               |      1 |      5 |      5 |00:00:13.09 |     283K|    283K|  3072 |  3072 | 2048  (0)|
|   2 |   VIEW               |               |      1 |   8647K|   2445K|00:00:13.16 |     283K|    283K|   |   |      |
|   3 |    HASH UNIQUE       |               |      1 |   8647K|   2445K|00:00:12.57 |     283K|    283K|   113M|    10M|  216M (0)|
|   4 |     TABLE ACCESS FULL| USERS         |      1 |     29M|     29M|00:00:07.68 |     283K|    283K|   |   |      |
--------------------------------------------------------------------------------------------------------------------------------------------

다음을 시도해 보는 것은 어떻습니까?col 및 userid에 인덱스가 있는 경우 인덱스에서 완전히 해결해야 하며 테이블을 터치할 필요가 없습니다.

Select count(userid) n, col
from (select col, userid from users group by col, userid)
group by col
;

언급URL : https://stackoverflow.com/questions/9280528/oracle-distinct-doing-sort

반응형