´äº¯: À¯¼öÀÍ´ÔÀÇ ¸»¾¸´ë·Î 2¹øÀÌ Á¤´äÀÔ´Ï´Ù. ¾Æ·¡´Â ½ÇÇà ¼ø¼­ÀÔ´Ï´Ù. 1) ¸ÕÀú 2~3 ¹øÀ» ¼öÇàÇÏ°í 2) 5~13¹øÀ» ¼öÇàÇؼ­ 3) id 4¹ø¿¡¼­ sort merge Á¶ÀÎÀ» ÇÏ°Ô µË´Ï´Ù. ÇÑ°¡Áö À¯ÀÇ »çÇ×Àº id 5¹ø¿¡¼­ ¼­ºêÄõ¸®ÁýÇÕÀÇ °á°ú·Î filter °¡ ¼öÇàµË´Ï´Ù. Áï 9~13 ¹øÀÇ ¼­ºêÄõ¸® °á°úÁýÇÕÀ» ÀÌ¿ëÇÏ¿© 6~8 ÀÇ °á°úÁýÇÕÀ» filter Çϴ°ÍÀÔ´Ï´Ù. ¾Æ·¡´Â ÃÖÁ¾ÀûÀ¸·Î Transformation µÈ SQL ÀÔ´Ï´Ù. SELECT d.department_id, d.department_name, v.sal FROM department d, (SELECT /*+ no_merge */ department_id, SUM (salary) AS sal FROM employee WHERE job_id = 'ST_CLERK' GROUP BY department_id ) v WHERE d.department_id = v.department_id AND v.sal = (SELECT MAX (v.sal) --> filter ¼öÇà FROM (SELECT department_id, SUM (salary) AS sal FROM employee WHERE job_id = 'ST_CLERK' GROUP BY department_id ) v) ; ------------------------------------------------------------------------------------ | Id | Operation | Name | Starts | A-Rows | Buffers | ------------------------------------------------------------------------------------ | 1 | MERGE JOIN | | 1 | 1 | 8 | | 2 | TABLE ACCESS BY INDEX ROWID | DEPARTMENT | 1 | 6 | 4 | | 3 | INDEX FULL SCAN | DEPT_ID_PK | 1 | 6 | 2 | |* 4 | SORT JOIN | | 6 | 1 | 4 | |* 5 | VIEW | | 1 | 1 | 4 | | 6 | HASH GROUP BY | | 1 | 1 | 2 | | 7 | TABLE ACCESS BY INDEX ROWID | EMPLOYEE | 1 | 20 | 2 | |* 8 | INDEX RANGE SCAN | EMP_JOB_IX | 1 | 20 | 1 | | 9 | SORT AGGREGATE | | 1 | 1 | 2 | | 10 | VIEW | | 1 | 1 | 2 | | 11 | SORT GROUP BY | | 1 | 1 | 2 | | 12 | TABLE ACCESS BY INDEX ROWID| EMPLOYEE | 1 | 20 | 2 | |* 13 | INDEX RANGE SCAN | EMP_JOB_IX | 1 | 20 | 1 | ------------------------------------------------------------------------------------ Predicate Information (identified by operation id): --------------------------------------------------- 4 - access("D"."DEPARTMENT_ID"="V"."DEPARTMENT_ID") filter("D"."DEPARTMENT_ID"="V"."DEPARTMENT_ID") 5 - filter("V"."SAL"=) 8 - access("JOB_ID"='ST_CLERK') 13 - access("JOB_ID"='ST_CLERK') Áú¹®: -------------------------------------------------------------------------------------------------------------- - 11gr2¿¡¼­ URSW°¡ Àß µ¿ÀÛÇϴ°ÍÀ» È®ÀÎÇß½À´Ï´Ù. - 10g¿¡¼­ ¾î¶»°Ô µ¿ÀÛÇϳª È®ÀÎÇϱâ À§ÇØ Ç÷£À» º¸´Ï URSW°¡ µ¿ÀÛÇÏÁö ¾Ê´Â°ÍÀ» È®ÀÎÇß½À´Ï´Ù. - ±Ã±ÀÇÑÁ¡ : ½ÇÇà°èȹ ¼ø¼­(10GR2¿¡¼­) 1) MERGE JOIN½Ã id±âÁØÀ¸·Î 1 ~ 8±îÁö ¼öÇàÇÑÈÄ, emploryy Å×À̺íÀ» ÀдÂÁö 2) id±âÁØ 5¹øÀÇ view·Î Çؼ­ 1~3±îÁö sort, 5~13±îÁö sortÇؼ­ 4¹øÀ¸·Î sortÇÏ´ÂÁö - Àú´Â 2)¹øÀ¸·Î µ¿ÀÛÇÑ´Ü°í »ý°¢Çϴµ¥ view°¡ ¾îµð±îÁö ÀÎÁö ¸ð¸£°Ú¾î¿ä. startsÇ׸ñÀ» º¸¸é 2)¹øÀ¸·Î ¼ø¼­·Î ¿òÁ÷ÀÏ°Å °°Àºµ¥.. - µµ¿ÍÁÖ½Ã¸é °¨»çÇÏ°Ú½À´Ï´Ù. <<Äõ¸®>> WITH v AS (SELECT /*+ inline */ department_id, SUM (salary) AS sal FROM employee WHERE job_id = 'ST_CLERK' GROUP BY department_id ) SELECT d.department_id, d.department_name, v.sal FROM department d, v WHERE d.department_id = v.department_id AND v.sal = (SELECT MAX (v.sal) FROM v) ; <<11gr2>> --------------------------------------------------------------------------------------------------------------------------- | Id | Operation | Name | Starts | A-Rows | A-Time | Buffers | OMem | 1Mem | Used-Mem | --------------------------------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 1 |00:00:00.01 | 6 | | | | | 1 | MERGE JOIN | | 1 | 1 |00:00:00.01 | 6 | | | | | 2 | TABLE ACCESS BY INDEX ROWID | DEPARTMENT | 1 | 6 |00:00:00.01 | 4 | | | | | 3 | INDEX FULL SCAN | DEPT_ID_PK | 1 | 6 |00:00:00.01 | 2 | | | | |* 4 | SORT JOIN | | 6 | 1 |00:00:00.01 | 2 | 2048 | 2048 | 2048 (0)| |* 5 | VIEW | | 1 | 1 |00:00:00.01 | 2 | | | | | 6 | WINDOW BUFFER | | 1 | 1 |00:00:00.01 | 2 | 2048 | 2048 | 2048 (0)| | 7 | HASH GROUP BY | | 1 | 1 |00:00:00.01 | 2 | 801K| 801K| 397K (0)| | 8 | TABLE ACCESS BY INDEX ROWID| EMPLOYEE | 1 | 20 |00:00:00.01 | 2 | | | | |* 9 | INDEX RANGE SCAN | EMP_JOB_IX | 1 | 20 |00:00:00.01 | 1 | | | | --------------------------------------------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 4 - access("D"."DEPARTMENT_ID"="V"."DEPARTMENT_ID") filter("D"."DEPARTMENT_ID"="V"."DEPARTMENT_ID") 5 - filter("V"."SAL"="ITEM_0") 9 - access("JOB_ID"='ST_CLERK') <<10gr2>> ---------------------------------------------------------------------------------------------------------------------------- | Id | Operation | Name | Starts | A-Rows | A-Time | Buffers | OMem | 1Mem | Used-Mem | ---------------------------------------------------------------------------------------------------------------------------- | 1 | MERGE JOIN | | 1 | 1 |00:00:00.01 | 8 | | | | | 2 | TABLE ACCESS BY INDEX ROWID | DEPARTMENT | 1 | 6 |00:00:00.01 | 4 | | | | | 3 | INDEX FULL SCAN | DEPT_ID_PK | 1 | 6 |00:00:00.01 | 2 | | | | |* 4 | SORT JOIN | | 6 | 1 |00:00:00.01 | 4 | 2048 | 2048 | 2048 (0)| |* 5 | VIEW | | 1 | 1 |00:00:00.01 | 4 | | | | | 6 | HASH GROUP BY | | 1 | 1 |00:00:00.01 | 2 | 801K| 801K| 314K (0)| | 7 | TABLE ACCESS BY INDEX ROWID | EMPLOYEE | 1 | 20 |00:00:00.01 | 2 | | | | |* 8 | INDEX RANGE SCAN | EMP_JOB_IX | 1 | 20 |00:00:00.01 | 1 | | | | | 9 | SORT AGGREGATE | | 1 | 1 |00:00:00.01 | 2 | | | | | 10 | VIEW | | 1 | 1 |00:00:00.01 | 2 | | | | | 11 | SORT GROUP BY | | 1 | 1 |00:00:00.01 | 2 | 2048 | 2048 | 2048 (0)| | 12 | TABLE ACCESS BY INDEX ROWID| EMPLOYEE | 1 | 20 |00:00:00.01 | 2 | | | | |* 13 | INDEX RANGE SCAN | EMP_JOB_IX | 1 | 20 |00:00:00.01 | 1 | | | | ---------------------------------------------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 4 - access("D"."DEPARTMENT_ID"="V"."DEPARTMENT_ID") filter("D"."DEPARTMENT_ID"="V"."DEPARTMENT_ID") 5 - filter("V"."SAL"=) 8 - access("JOB_ID"='ST_CLERK') 13 - access("JOB_ID"='ST_CLERK')