ÃֽŠ°Ô½Ã±Û(DB)
2018.12.07 / 17:28

½ÇÀüDB Æ©´×- OracleÆí

hanulbit
Ãßõ ¼ö 189

¡ß1ÀÏÂ÷
1. ¼º´ÉÀ̽´
- ÀÀ´ä½Ã°£ = service time + wait time
- ¼º´ÉÀ̽´ÀÇ ´ëºÎºÐÀº wait time
- wait time ÀÇ ´ëºÎºÐÀº I/O

2. °Ô½ÃÆÇ ¼³°è½Ã °í·ÁÁ¡
- HEADER¿Í º»¹®À» ¹°¸®ÀûÀ¸·Î 1°³ÀÇ Å×À̺í·Î »ý¼º½Ã ³»¿ëÀÌ ±ä°æ¿ì(LOB,LONG) 1°³ÀÇ ROW°¡ 1°³ÀÌ»óÀÇ BLOCKÀ» Â÷Áö ÇÒ¼ö ÀÖÀ½
- º»¹®À» ºÐ¸®¼³°èÇÔÀ¸·Î½á. °Ô½ÃÆÇÀÇ ¸ñ·Ï(HEADER)Àº »¡¸® ³ª¿À°Ô ÇÏ°í ÇÊ¿ä½Ã ³»¿ëÀ» º¸°Ô ÇÏ´Â ¹æ½ÄÀ¸·Î ¼º´ÉÇâ»óÀ» ²ÒÇÒ¼ö ÀÖÀ½

3.ƯÁ¤ Ä÷³ÀÇ NULL ¿¡ ´ëÇÑ °í¹Î ÇÊ¿ä
- SQL»ó¿¡ NVLÇÔ¼ö »ç¿ëÇÑ´Ù°í Çϸé ÇØ´ç NVL»ç¿ëÀ¸·Î INDEX»ç¿ëÀÌ ºÒ°¡´ÉÇÏ°Ô µÊ
- NVLÀ» »ç¿ëÇÑ´Ù°í ÇÏ¸é ¼³°è½ÃÁ¡ºÎÅÍ NULL Çã¿ëÇÒÁö, NULL´ë½Å µðÆúÆ®°ªÀ» ¼³Á¤ÇÒÁö¿¡ ´ëÇÑ °í¹ÎÀÌ ÇÊ¿äÇÔ

4. ºÎºÐ¹üÀ§ VS Àüü ¹üÀ§ => ONLINE VS BATCH
5. Á¶ÀÎ : Á¤±ÔÈ­ ÀÌÈÄ ¿£ÅÍƼµé°£ÀÇ °ü°è¸¦ ÅëÇØ Ã³¸®
6. ½ÇÇà°èȹÀ» È®ÀÎÇѴٴ°ÍÀº ?
¢¡ INDEX¸¦ »ç¿ëÇÏ´ÂÁö¸¸  È®ÀÎÇϴ°ÍÀÌ ¾Æ´Ñ ÀûÀýÇÑ INDEX¸¦ »ç¿ëÇÏ´ÂÁö ³»°¡ ÀǵµÇϴ´ë·Î ½ÇÇàÀ̵ǴÂÁö¸¦ È®ÀÎÇϴ°ÍÀÌ´Ù.
7. ÀûÀýÇÑ INDEX ¼±ÅÃÀº Á¶°Ç¿¡ µû¸¥ ´Ù¸£´Ù. Á¶°Ç¿¡ µû¶ó¼­ INDEX¸¦ À¯µµÇϰųª, OPTIMIZER¿¡°Ô ¸Ã±â°Å³ª ÇؾßÇÔ
8. NVL(MAX(SEQ),0) +1  ¢¡ NULL°ªÀÌ ³ª¿Ã°æ¿ì¸¦ °í·Á

9. NL Á¶ÀÎ : ¼Ò·®ÀÇ RANDOM ACCESS ¿¡ À¯¸®
- Oute Table/ Inner Table
- Driving Table / Lookup Table
- Driving Table ¹üÀ§°¡ ÀûÀ»°Í
- 3°³ÀÌ»óÀÇ NLÁ¶Àνà ù¹ø° Á¶ÀÎ °á°ú °Ç¼ö°¡ ÀûÀ»¼ö·Î À¯¸®
- Join ¿¬°áÁ¶°Ç(Lookup Table)ÀÇ IndexÀÇ À¯¹«°¡ Áß¿ä
¢¡ ¾çÂÊ¿¡ ¿¬°áÁ¶°Ç¿¡ Index°¡ ¾øÀ¸¸é Sort Merge JoinÀ̳ª Hash JoinÀ¸·Î ó¸®
- µ¥ÀÌÅÍ·®ÀÌ ÀÛÀº Table¿¡ Index°¡ ¾ø°í Join¿¬°áÀÌ ÀÖ´Ù¸é Index¸¦ »ý¼ºÇØ¾ß ÇÔ.

10. Sort Merge Join : Àüü ¹üÀ§ ó¸®, SortÀÇ ´ë»ó ¾çÀÌ Áß¿äÇÔ

11. Hash Join : Build Input(T)À» ó¸®Çؼ­ HASHÇÔ¼ö·Î ÆÄƼ¼Å´×ÇÏ¿© HASH AREA¿¡ LOADING  ¢¡  Proved Input(T)À» Àоî HASHÇÔ¼ö¸¦ ¸Þ¸ð¸®¿¡¼­ È®ÀÎÇؼ­ ó¸®
¢¡ FULL SACN => Multi Blok I/O



2ÀÏÂ÷
1. not in  VS not exist ÀÇ Â÷ÀÌÁ¡
- not in Àº nullÁ¦¿ÜµÊ not exist´Â nullÆ÷ÇÔ°ªµµ ó¸®

2.sort °¡ ¹ß»ýÇÏ´Â °æ¿ì
distinct
union
minus
intersect
subquery(Á¦°øÀÚ)  <¤Ñ> È®ÀÎÀÚ ¼­ºêÄõ¸® col in(select col from tab where ¡¦.)
                                                                = exist (select col from tab where ¡¦)


3. Á¦°øÀÚ subquery ¢¡ È®ÀÎÀÚ ¼­ºêÄõ¸®°¡ µÉ¼ö ÀÖ°Ô Àüȯ unnest ÈùÆ® ȤÀº exist -> in

4. Index »ç¿ëÀÌ ÃÖ¼±Àº ¾Æ´Ï´Ù.
- index´Â single blok I/O, full scanÀº multi block I/OÀÓ, index»ç¿ë½Ã ¹üÀ§°¡ ¸¹Àº°æ¿ì full scanÀÌ ´õ ÁÁÀ½

5. Çհ踦 À§ÇÑ Grouping : ƯÁ¤ ºÎ¼­ÀÇ ½ÇÀû°ú ºÎ¼­ Àüü ½ÇÀûÀ» ±¸ÇÒ¶§  ¢¡ P.115
- copy_t, ȤÀº ROLLUP ÇÔ¼ö ÀÌ¿ë

6. Group by ÀýÀÇ ÇÔ¼ö»ç¿ëÀº ÀÚÁ¦ÇÑ´Ù. ¢¡ p120
¢¡ SelectÀý¿¡¼­ ¿ÜºÎ¿¡¼­ ÇÔ¼ö»ç¿ëÀ» Çѹø¸¸ ÇÒ¼ö ÀÖ°Ôó¸® ÇÑ´Ù.

7. Literal Sql ¢¡ Static Sql  Hard ParsingÀÌ ¸¹Àº °æ¿ì ½Ã½ºÅÛ Àüü ¼º´É¿¡ ¿µÇâÀ» ¹Ìħ
http://blog.naver.com/kang_sok/60152188327









3ÀÏÂ÷

1.DBMS_XPLAN ½Ç½À (P.181)

CREATE TABLE STORER2 AS

SELECT LPAD(LEVEL,7,'0') CUSTID

     ,LPAD(LEVEL,7,'0') CUSTNM

     ,'ABC'||LPAD(MOD(LEVEL,100),3,'0') CUST

     ,DECODE(MOD(LEVEL,30),0,'CJGLS',

             LPAD(MOD(LEVEL,100),5,'0')) STOREKEY

     ,CHR(MOD(LEVEL,10)+65) CUSTTYPE

 FROM DUAL

 CONNECT BY LEVEL <= 1000000;



ALTER TABLE STORER2 ADD CONSTRAINT CUSTID_PK

PRIMARY KEY (CUSTID);


DROP INDEX STORE2_IDX1;


CREATE INDEX STORE2_IDX1 ON STORER2(CUST,STOREKEY,CUSTTYPE);



EXEC DBMS_STATS.GATHER_TABLE_STATS(USER,'STORER2');


EXEC DBMS_STATS.GATHER_INDEX_STATS(USER,'STORE2_IDX1');


alter system flush buffer_cache;


alter system flush shared_pool;


SELECT /*+ GATHER_PLAN_STATISTICS */

      COUNT(DISTINCT CUSTNM)

 FROM STORER2 A

WHERE STOREKEY IN ('CJGLS','00001')

  AND CUST = 'ABC001'

  AND CUSTTYPE IN ('H','B','X')

  AND ROWNUM < 2000;


select * from table(dbms_xplan.display_cursor(null,null,'allstats last outline'));

=========================½ÇÇà °á°ú-----------------------

Row# Plan_table_output


1 SQL_ID  7p7xg3t3nbfms, child number 0

2 -------------------------------------

3 SELECT /*+ GATHER_PLAN_STATISTICS */        COUNT(DISTINCT CUSTNM)   FROM STORER2 A  WHERE STOREKEY IN ('CJGLS','00001')    AND

4 CUST = 'ABC001'    AND CUSTTYPE IN ('H','B','X')    AND ROWNUM < 2000

5

6 Plan hash value: 667456922

7

8 --------------------------------------------------------------------------------------------------------------------------------------------

9 | Id  | Operation                      | Name        | Starts | E-Rows | A-Rows |   A-Time   | Buffers | Reads  |  OMem |  1Mem | Used-Mem |

10 --------------------------------------------------------------------------------------------------------------------------------------------

11 |   1 |  SORT GROUP BY                 |             |      1 |      1 |      1 |00:00:00.18 |    1010 |   1088 | 73728 | 73728 |          |

12 |*  2 |   COUNT STOPKEY                |             |      1 |        |   1999 |00:00:00.21 |    1010 |   1088 |       |       |          |

13 |   3 |    INLIST ITERATOR             |             |      1 |        |   1999 |00:00:00.20 |    1010 |   1088 |       |       |          |

14 |   4 |     TABLE ACCESS BY INDEX ROWID| STORER2     |      1 |     39 |   1999 |00:00:00.20 |    1010 |   1088 |       |       |          |

15 |*  5 |      INDEX RANGE SCAN          | STORE2_IDX1 |      1 |     39 |   1999 |00:00:00.05 |      10 |     64 |       |       |          |

16 --------------------------------------------------------------------------------------------------------------------------------------------

17

18 Outline Data

19 -------------

20

21  /*+

22      BEGIN_OUTLINE_DATA

23      IGNORE_OPTIM_EMBEDDED_HINTS

24      OPTIMIZER_FEATURES_ENABLE('10.2.0.1')

25      ALL_ROWS

26      OUTLINE_LEAF(@"SEL$1")

27      INDEX(@"SEL$1" "A"@"SEL$1" ("STORER2"."CUST" "STORER2"."STOREKEY" "STORER2"."CUSTTYPE"))

28      END_OUTLINE_DATA

29  */

30

31 Predicate Information (identified by operation id):

32 ---------------------------------------------------

33

34   2 - filter(ROWNUM<2000)

35   5 - access("CUST"='ABC001' AND (("STOREKEY"='00001' OR "STOREKEY"='CJGLS')) AND (("CUSTTYPE"='B' OR "CUSTTYPE"='H' OR

36              "CUSTTYPE"='X')))



2. ½Ç½À

EXPLAIN PLAN SET STATEMENT_ID='P1' FOR  

SELECT /*+ GATHER_PLAN_STATISTICS */

      COUNT(DISTINCT CUSTNM)

 FROM STORER2 A

WHERE STOREKEY IN ('CJGLS','00001')

  AND CUST = 'ABC001'

  AND CUSTTYPE IN ('H','B','X')

  AND ROWNUM < 2000;  

  

SELECT * FROM TABLE(dbms_xplan.display(null,'P1','advanced'));


3. °Ô½ÃÆÇ ÆäÀÌÁö ó¸® ±â¹ý ¢¡ »õ·Î¾´ ´ë¿ë·® µ¥ÀÌÅͺ£À̽º ¼Ö·ç¼Ç Áß°£Âë¿¡ ÇØ´ç ÇعýÀÌ ÀÖÀ½

4. V$SEGMENTS_STATISTICS : ÇØ´ç VIEW¸¦ ÅëÇØ I/OµîÀÇ ¼¼ºÎ³»¿ªÀ» È®Àΰ¡´ÉÇÏ´Ù.
- ITL waits : update transactionÀÌ ¸¹Àº °æ¿ì PCT FREE°ø°£ÀÌ ºÎÁ·ÇØÁú¼ö ÀÖ´Ù.
 ¢¡ INIT TRANS°ªÀ» Á¶Á¤ÇÏ¿© ´Ã¸±¼ö ÀÖÀ¸³ª, ÀÌ°æ¿ì DATAÀúÀå °ø°£ÀÌ ºÎÁ·ÇØÁ®¼­ TRADE OFF°¡ ÀÖÀ½

5. v$sqlarea µî v$sql  µ¿Àû viewÈ°¿ëÇÏ¿© °úºÎÇÏ Äõ¸® ÃßÃâ p.187
6. v$sql_monitor  ¢¡ 11g ºÎÅÍ Áö¿øÇÏ´Â Real-Time SQL Monitor

4ÀÏÂ÷
1. À妽º ÃÖÀûÈ­Àü·«
- »ç¿ëÇÏ°í ÀÖ´Â sqlÃßÃâ ¢¡  AccessÀ¯Çü ºÐ¼® ¢¡À妽º »ý¼º¢¡ ¿ÉƼ¸¶ÀÌÀú ½ÇÇà°èȹ È®ÀÎ

2. Trace ºÐ¼®À» ÅëÇÑ ¼º´É°³¼±
- whereÁ¶°ÇÀÇ subquery°¡ °ø±ÞÀÚ Àΰ¡? È®ÀÎÀÚ Àΰ¡? ¿¡ µû¶ó Join¼ø¼­°¡ º¯°æµÊ
- ÀûÀýÇÑ Access¹üÀ§°¡ µÇµµ·Ï(°ø±ÞÀÚ Äõ¸®ÇüÅ°¡ µÇµµ·Ï) ÈùÆ®, À妽º »ý¼ºµîÀ» ÇØÁà¾ß ÇÔ

3. ¹èÄ¡ ó¸® ÇÁ·Î±×·¥ °³¼±
- LoopÇü ·ÎÁ÷ ¢¡ sum(decode µîÀ» ÀÌ¿ë IF ¡¦ ELSEÁ¶°ÇÀ» Çѹø¿¡ ó¸®
- UPDATE¿Í INSERT¸¦ µ¿½Ã ó¸®ÇÏ´Â °æ¿ì MERGE INTO È°¿ë
- FetchÇÑ °ªÀ» Á¶°Ç¿¡ µû¶ó ¹Ýº¹Çϴ°æ¿ì Fetch½ÃÁ¡¿¡ not exist ¸¦ ÀÌ¿ë
- ¹Ýº¹±¸¹®¿¡ ÀÇÇÑ union ÁýÇÕÀº WITH ÀýÀ» È°¿ë
- INSERT ALL : Á¶°ÇÀÌ ¾ø´Â°æ¿ì , Insert First : Á¶°ÇÀÌ Àִ°æ¿ì
 ÇϳªÀÇ Insert¹®ÀåÀ¸·Î multi row¸¦ ÇϳªÀÇ tableȤÀº multi table¿¡  insertÇÏ´Â °æ¿ì¿¡ »ç¿ë
 arrey processing (type)À¸·Î 󸮽à FORALL ±¸¹®°ú ÇÔ²²



Ãâó: http://uincity.tistory.com/225 [¿­½É³²ÀÇ ÀÏ»ó]