½ÇÀüDB Æ©´×- OracleÆí
¡ß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 [¿½É³²ÀÇ ÀÏ»ó]