ÀÌÁ¦ ´Ù¸¥Áú¹®À» ´øÁ®º¸ÀÚ. Not In ¼­ºêÄõ¸®¿¡¼­ ¸ÞÀÎÄõ¸®¿Í Á¶ÀεǴ Ä÷³ÀÌ NULLÀ» Çã¿ëÇÑ´Ù¸é Is Null ¼­ºêÄõ¸®°¡ Ç×»ó Ãß°¡µÉ±î? ±×·¸Áö ¾Ê´Ù. ¾Æ·¡ÀÇ SQLÀ» º¸ÀÚ. SELECT /*+ QB_NAME(MAIN) USE_HASH(E@SUB) */ d.department_id, d.department_name, location_id FROM department d WHERE d.department_id NOT IN (SELECT /*+ QB_NAME(SUB) */ e.department_id FROM employee e) AND d.location_id = 1700; ----------------------------------------------------------------------------------------- | Id | Operation | Name | A-Rows | A-Time | Buffers | ----------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 0 |00:00:00.02 | 9 | |* 1 | HASH JOIN ANTI NA | | 0 |00:00:00.02 | 9 | | 2 | TABLE ACCESS BY INDEX ROWID| DEPARTMENT | 21 |00:00:00.01 | 2 | |* 3 | INDEX RANGE SCAN | DEPT_LOCATION_IX | 21 |00:00:00.01 | 1 | | 4 | TABLE ACCESS FULL | EMPLOYEE | 97 |00:00:00.01 | 7 | ----------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 1 - access("D"."DEPARTMENT_ID"="E"."DEPARTMENT_ID") 3 - access("D"."LOCATION_ID"=1700) ¼­ºêÄõ¸®ÀÇ Á¶Àιæ¹ýÀ» Hash JoinÀ¸·Î ¹Ù²ÙÀÚ NullÀ» üũÇÏ´Â Filter°¡ »ç¶óÁ³´Ù. ÀÌó·³ ANTI NA´Â Á¶Àιæ¹ý¿¡ µû¶ó ÀûÀÀÀû Ž»ö(Adaptive Null Aware Scan)À» ÇÑ´Ù. ¿¹ÄÁ´ë Nested Loop JoinÀ» ¼±ÅÃÇϸé NullÀ» üũÇÏ´Â ¼­ºêÄõ¸®°¡ Ãß°¡µÇ°í Hash JoinÀ» ¼±ÅÃÇÏ¸é ¼­ºêÄõ¸®°¡ Ãß°¡µÇÁö ¾Ê´Â°ÍÀÌ´Ù.