|
Á¦¸ñ ¾øÀ½
SQLÀ»
ÀÛ¼ºÇÒ ¶§ ƯÁ¤ÇÑ ¼ø¼´ë·Î TABLEÀÌ ¾×¼¼½º µÇ±â¸¦ ¿øÇÏ¿©
±×
¼ø¼´ë·Î ÀζóÀκä·Î ¹¾îÁشٰí ÇØµµ ½ÇÁ¦ ¼öÇà½Ã ¿ÉƼ¸¶ÀÌÀú´Â ÀζóÀκä·Î ¹ÀÎ
¼ø¼´ë·Î ¼öÇàÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó SQLÀ» REWIRTE Çϰí ÃÖÀûÀ̶ó°í ÆÇ´ÜµÇ´Â ¼ø¼·Î
¼öÇàÀ» ÇÕ´Ï´Ù.
(¹°·Ð
ROWNUM »ç¿ëÀ̳ª ORDERED, NO_MERGE µî ¿©·¯ ÈùÆ®¸¦ »ç¿ëÇÏ¿© ¿øÇÏ´Â ¼ø¼´ë·Î °Á¦ÇÒ
¼öµµ ÀÖ½À´Ï´Ù)
Áú¹®ÇϽÅ
°æ¿ì´Â ¾Æ¸¶µµ ±Ùº»ÀûÀ¸·Î ÀζóÀκäÀÇ ¹®Á¦¶ó±â º¸´Ù´Â
CONNECT
BY Äõ¸®ÀÇ ¹®Á¦¶ó°í º¸¿©Áý´Ï´Ù.
ÀϹÝÀûÀÎ
SQL ¿¡¼ WHERE Àý¿¡ ÀÖ´Â »ó¼öÁ¶°ÇÀÌ µå¶óÀ̺ù Á¶°ÇÀÌ µÇÁö¸¸
CONNECT
BY Äõ¸®¿¡¼´Â Á¶±Ý ´Ù¸£°Ô ¼öÇàÀÌ µË´Ï´Ù.
¡Ø
CONNECT BY Äõ¸®´Â ¾Æ·¡¿Í °°Àº ¼ø¼·Î ¼öÇàÀÌ µË´Ï´Ù.
SELECT
*
FROM
ORGANIZATION
WHERE
ALIVE_DATE >= SYSDATE -->
3. ÇÊÅ͸µ Á¶°Ç (µå¶óÀ̺ù Á¶°ÇÀÌ ¾Æ´Ô)
START WITH PARENT_DEPARTMENT_ID IS NULL
-->
1. µå¶óÀ̺ù Á¶°Ç
CONNECT BY PRIOR DEPARTMENT_ID = PARENT_DEPARTMENT_ID; -->
2. Á¶ÀÎ Á¶°Ç
±×·±µ¥
°æ¿ì¿¡ µû¶ó CONNECT BY Äõ¸®ÀÇ ¼öÇà°á°ú°¡ ¿øÇÏ´Â °á°ú¿Í
´Ù¸¥
°æ¿ì°¡ ¹ß»ýÇÒ ¼ö ÀÖ½À´Ï´Ù.
¿¹¸¦
µé¾î º¸°Ú½À´Ï´Ù.
CREATE
TABLE ORGANIZATION
(
DEPARTMENT_ID
NUMBER,
ALIVE_DATE
DATE,
DEPARTMENT_NAME
VARCHAR2(30),
PARENT_DEPARTMENT_ID
NUMBER
);
ALTER
TABLE ORGANIZATION
ADD
CONSTRAINTS ORGANIZATION_PK PRIMARY KEY (DEPARTMENT_ID, ALIVE_DATE)
USING
INDEX NOLOGGING;
INSERT
INTO ORGANIZATION
VALUES
(1, TO_DATE('99991231','YYYYMMDD'), '¿£ÄÚ¾ÆÄÁ¼³ÆÃ', NULL);
INSERT
INTO ORGANIZATION
VALUES
(2, TO_DATE('20091231','YYYYMMDD'), 'ÄÁ¼³ÆÃº»ºÎ(OLD)', 1);
INSERT
INTO ORGANIZATION
VALUES
(3, TO_DATE('99991231','YYYYMMDD'), '1»ç¾÷ºÎ(OLD)', 2);
INSERT
INTO ORGANIZATION
VALUES
(4, TO_DATE('99991231','YYYYMMDD'), '2»ç¾÷ºÎ(OLD)', 2);
INSERT
INTO ORGANIZATION
VALUES
(5, TO_DATE('99991231','YYYYMMDD'), 'ÄÁ¼³ÆÃ»ç¾÷ºÎ(NEW)', 1);
INSERT
INTO ORGANIZATION
VALUES
(6, TO_DATE('99991231','YYYYMMDD'), '1»ç¾÷ºÎ(NEW)', 5);
INSERT
INTO ORGANIZATION
VALUES
(7, TO_DATE('99991231','YYYYMMDD'), '2»ç¾÷ºÎ(NEW)', 5);
¿£ÄÚ¾ÆÄÁ¼³ÆÃÀ̶õ
ȸ»ç¿¡¼ 2010³â¿¡ Á¶Á÷°³ÆíÀ¸·Î ÀÎÇØ ±âÁ¸ Á¶Á÷À»
INVALID
ó¸®ÇÏ°í »õ·Î¿î Á¶Á÷Äڵ带 »ý¼ºÇß½À´Ï´Ù.
--
OLD Á¶Á÷ ±¸¼º
(1)
¿£ÄÚ¾ÆÄÁ¼³ÆÃ ---> (2) ÄÁ¼³ÆÃº»ºÎ(OLD) ---> (3) 1»ç¾÷ºÎ(OLD)
|
--->
(4) 2»ç¾÷ºÎ(OLD)
--
NEW Á¶Á÷ ±¸¼º
(1)
¿£ÄÚ¾ÆÄÁ¼³ÆÃ ---> (5) ÄÁ¼³ÆÃº»ºÎ(NEW) ---> (6) 1»ç¾÷ºÎ(NEW)
|
--->
(7) 2»ç¾÷ºÎ(NEW)
¾ïÁö·Î(?)
»óȲÀ» ¸¸µé±â À§Çؼ OLD Á¶Á÷ÀÎ
"1»ç¾÷ºÎ(OLD)",
"2»ç¾÷ºÎ(OLD)" ÀÇ ALIVE_DATE ¸¦ '20091231' ·Î ¼³Á¤ÇÏÁö ¾Ê°í
ȗˤ
Á¶Á÷ÀÎ "ÄÁ¼³ÆÃº»ºÎ(OLD)" ¸¸ '20091231' ·Î ¼³Á¤ÇÏ¿© INVALID 󸮸¦
Çß½À´Ï´Ù.
1.
SQL Å×½ºÆ® 1
SELECT
*
FROM
ORGANIZATION
WHERE
ALIVE_DATE >= SYSDATE
START
WITH PARENT_DEPARTMENT_ID IS NULL
CONNECT
BY PRIOR DEPARTMENT_ID = PARENT_DEPARTMENT_ID;
SELECT
* FROM TABLE (DBMS_XPLAN.DISPLAY);
-------------------------------------------------------------------------------------------
|
Id | Operation |
Name | Rows | Bytes |
Cost (%CPU)| Time |
-------------------------------------------------------------------------------------------
|
0 | SELECT STATEMENT |
|
1 | 47 | 2
(0)| 00:00:01 |
|*
1 | FILTER |
|
| |
| |
|*
2 | CONNECT BY WITH FILTERING| |
| |
| |
|*
3 | FILTER |
|
| |
| |
|
4 | TABLE ACCESS FULL |
ORGANIZATION | 1 | 47 | 2
(0)| 00:00:01 |
|*
5 | HASH JOIN |
|
| |
| |
|
6 | CONNECT BY PUMP |
|
| |
| |
|
7 | TABLE ACCESS FULL |
ORGANIZATION | 1 | 47 | 2
(0)| 00:00:01 |
-------------------------------------------------------------------------------------------
Predicate
Information (identified by operation id):
---------------------------------------------------
1
- filter("ALIVE_DATE">=SYSDATE@!)
2
- access("PARENT_DEPARTMENT_ID"=PRIOR "DEPARTMENT_ID")
3
- filter("PARENT_DEPARTMENT_ID" IS NULL)
5
- access("PARENT_DEPARTMENT_ID"=PRIOR "DEPARTMENT_ID")
--
¼öÇà°á°ú
Department_id
Alive_date Department_name Parent_department_id
----------------------------------------------------------------------
1
12/31/9999
¿£ÄÚ¾ÆÄÁ¼³ÆÃ
3
12/31/9999
1»ç¾÷ºÎ(OLD) 2
4
12/31/9999
2»ç¾÷ºÎ(OLD) 2
5
12/31/9999
ÄÁ¼³ÆÃ»ç¾÷ºÎ(NEW) 1
6
12/31/9999
1»ç¾÷ºÎ(NEW) 5
7
12/31/9999
2»ç¾÷ºÎ(NEW) 5
1¹ø
SQLÀÇ ½ÇÇà°èȹÀ» º¸¸é, "PARENT_DEPARTMENT_ID IS NULL" Á¶°ÇÀ¸·Î
µå¶óÀ̺ù
µÇ¾î CONNECT BY 󸮰¡ ¸ðµÎ ÀÌ·ç¾îÁø ÈÄ¿¡ ¸¶Áö¸·¿¡
"ALIVE_DATE
>= SYSDATE" °¡ Àû¿ëµÈ °ÍÀ» ¾Ë ¼ö ÀÖ½À´Ï´Ù.
ÀÌ
ºÎºÐ È®ÀÎ --> 1 - filter("ALIVE_DATE">=SYSDATE@!)
ÀÌ·¸°Ô
󸮵Ǵ٠º¸´Ï ¿øÇÏÁö ¾Ê´Â "1»ç¾÷ºÎ(OLD)", "2»ç¾÷ºÎ(OLD)"
Á¶Á÷±îÁö
SELECT °¡ µÇ°í ÀÖ½À´Ï´Ù.
2.
SQL Å×½ºÆ® 2
SELECT
*
FROM
(SELECT *
FROM
ORGANIZATION
WHERE
ALIVE_DATE >= SYSDATE
)
START
WITH PARENT_DEPARTMENT_ID IS NULL
CONNECT
BY PRIOR DEPARTMENT_ID = PARENT_DEPARTMENT_ID;
SELECT
* FROM TABLE (DBMS_XPLAN.DISPLAY);
------------------------------------------------------------------------------------------
|
Id | Operation |
Name | Rows | Bytes |
Cost (%CPU)| Time |
------------------------------------------------------------------------------------------
|
0 | SELECT STATEMENT |
|
1 | 47 | 2
(0)| 00:00:01 |
|*
1 | CONNECT BY WITH FILTERING| |
| |
| |
|*
2 | FILTER |
|
| |
| |
|*
3 | TABLE ACCESS FULL |
ORGANIZATION | 1 | 47 | 2
(0)| 00:00:01 |
|*
4 | HASH JOIN |
|
| |
| |
|
5 | CONNECT BY PUMP |
|
| |
| |
|*
6 | TABLE ACCESS FULL |
ORGANIZATION | 1 | 47 | 2
(0)| 00:00:01 |
------------------------------------------------------------------------------------------
Predicate
Information (identified by operation id):
---------------------------------------------------
1
- access("ORGANIZATION"."PARENT_DEPARTMENT_ID"=PRIOR
"ORGANIZATION"."DEPARTMENT_ID")
2
- filter("ORGANIZATION"."PARENT_DEPARTMENT_ID" IS NULL)
3
- filter("ALIVE_DATE">=SYSDATE@!)
4
- access("ORGANIZATION"."PARENT_DEPARTMENT_ID"=PRIOR
"ORGANIZATION"."DEPARTMENT_ID")
6
- filter("ALIVE_DATE">=SYSDATE@!)
--
¼öÇà°á°ú
Department_id
Alive_date Department_name Parent_department_id
----------------------------------------------------------------------
1
12/31/9999
¿£ÄÚ¾ÆÄÁ¼³ÆÃ
5
12/31/9999
ÄÁ¼³ÆÃ»ç¾÷ºÎ(NEW) 1
6
12/31/9999
1»ç¾÷ºÎ(NEW) 5
7
12/31/9999
2»ç¾÷ºÎ(NEW) 5
2¹ø
SQLÀÇ ½ÇÇà°èȹÀ» º¸¸é,
CONNECT
BY 󸮸¦ Çϱâ Àü¿¡ ¸ÕÀú "ALIVE_DATE >= SYSDATE" Á¶°Ç¿¡ ¸Â´Â µ¥ÀÌÅ͸¦
°É·¯ ³½ ÈÄ¿¡ ±× °á°ú ³»¿¡¼ CONNECT BY °¡ ÀÌ·çÁ³½À´Ï´Ù.
ÀÌ
ºÎºÐ È®ÀÎ --> 3 - filter("ALIVE_DATE">=SYSDATE@!)
±×¸®ÇÏ¿©
"1»ç¾÷ºÎ(OLD)", "2»ç¾÷ºÎ(OLD)" Á¶Á÷ÀÌ ºüÁö°í ¿øÇÏ´Â »õ·Î¿î
Á¶Á÷¸¸ SELECT °¡ µÇ¾ú½À´Ï´Ù.
PREDICATE
Á¤º¸¸¦ Æ÷ÇÔÇÑ Á¤È®ÇÑ ½ÇÇà°èȹÀ̳ª µ¥ÀÌÅÍ »ùÇÃÀÌ ¾ø¾î¼
³²Åý´Բ²¼
°ÞÀ¸½Å »óȲÀ» Á¤È®È÷ ¾Ë ¼ö ¾øÁö¸¸
Ȥ½Ã
À§¿Í °°ÀÌ CONNECT BY Äõ¸®ÀÇ ¹®Á¦°¡ ¾Æ´ÑÁö Çѹø È®ÀÎÇØ º¸½Ã±â ¹Ù¶ø´Ï´Ù.
|