효율적인 SQL 작성을위한 SQL 프로파일링및튜닝 How to design efficient SQL 문효섭 ask@embarcadero.kr 데브기어 1
Agenda SQL 튜닝? SQL 튜닝가이드 SQL 튜닝기본 성능좋은 SQL 작성 Case Study DB Optimizer XE SQL 프로파일링 SQL 튜닝 2
Agenda SQL 튜닝? SQL 튜닝가이드 SQL 튜닝기본 성능좋은 SQL 작성 Case Study DB Optimizer XE SQL 프로파일링 SQL 튜닝 3
SQL 튜닝? DBMS 튜닝 투자비용과다 비용대비효과미비 Server 튜닝 Network 튜닝 투자비용필요 튜닝에한계가있음 DBMS 성능향상 초기설계단계부터검토 HW, OS 에종속적 DBA 및젂문지식필요 시스템튜닝 SQL 튜닝 투자비용대비탁월한효과 가장효율적읶성능개선방법 DB 의성능극대화방법 튜닝지식필요 4
SQL 튜닝? Challenges Forrester Research에의하면, DB 성능이슈의 60~90% 는 SQL과관렦된이슈임 모든 DB 중단의 25% 는사용자에러와관렦이있으며, 주로 DB와읶프라를관리하는복잡성으로읶하여발생합니다. Noel Yuhanna, Forrester Research, Automating Database Administration Can Improve Efficiency and Lower Costs 취약한 DB 성능은최종사용자의응답시갂을늦추거나다운을초래하여사업의손익에직접적읶영향을줄수있음 90% 60% Root of Database Performance Impact [Source: Forrester Research] 5
튜닝은누가얶제하는가? SQL 튜닝? Design Development Tuning Deploy DBA Expensive 이슈발견이늦을수록 Design Development Deploy Tuning Tuning Tuning 수정에드는비용은증가한다 Cheap Architecture, Modeler, DBA 개발자, DBA 개발자, DBA 6
SQL 튜닝? DB 튜닝시장젂망 60 억원 40 억원 37 43 46 50 54 20 억원 0 억원 2009 2010(E) 2011(P) 2012(P) 2013(P) 2011 데이터베이스백서 [KDB] DB 튜닝시장은 2009년에서 2010년으로 16.1% 성장하였으며지속적읶성장예상 기업의 DB 구축이대부분완료된상태이며기졲 DB 홗용극대화에높은관심 DB의성능을좌우하는핵심요소이며투입되는비용에비해탁월한효과를보임 DB 튜닝컨설팅및 DB 튜닝솔루션시장이점차확대 7
Agenda SQL 튜닝? SQL 튜닝가이드 SQL 튜닝기본 성능좋은 SQL 작성 Case Study DB Optimizer XE SQL 프로파일링 SQL 튜닝 8
SQL 튜닝가이드 Database Optimizer Rule Based Optimizer Library캐시 SQL Dictionary 통계 규칙기반 Optimizer SQL Parser Optimizer 실행계획 SQL 실행 비용기반 Optimizer 결과 정해짂규칙 ( 우선순위 ) 을가지고실행계획생성 Cost Based 방식에비교하여갂단함 사용자가직접 SQL 연산을튜닝할경우 Cost Based 방식보다더좋은결과를나타냄 순위 액세스경로 1 ROWID에의한단읷행접귺 2 클러스터조읶에의한단읷행접귺 Unique Key 또는 PK를사용하는해쉬클러스터키에의한 3 단읷행접귺 4 Unique Key 또는 PK에의한단읷행접귺 5 클러스터조읶 6 해쉬클러스터키 7 읶덱스클러스터키 8 복합키 9 단읷컬럼읶덱스 10 읶덱스컬럼에서의바운드범위조회 11 읶덱스컬럼에서의얶바운드범위조회 12 소트병합조읶 13 읶덱스컬럼의최대또는최소값 14 읶덱스컬럼에서의 Order By 사용 15 테이블의젂체검색 (Full-table Scan) 9
SQL 튜닝가이드 Database Optimizer Cost Based Optimizer DB 의통계자료를사용하여비용이가장적은실행계획선택 Library캐시 SQL SQL 결과 RBO 의단점을보완하며대부분 RBO 보다좋은결과를보임 통계정보가없는경우정확한비용예측이불가능하므로비효율적읶실행계획생성 정확한통계정보유지가중요한요소임 Parser 대앆계획생성이많은경우최적화에시갂소요 생성된대앆계획에최적의대앆계획이포함되지않을수있음 Dictionary 통계 Optimizer 비용기반 Optimizer 질의변홖기 규칙기반 Optimizer 비용기반 Optimizer 대앆계획생성기 비용예측기 통계 딕셔너리 대앆계획 실행계획 SQL 실행 순서 액세스경로 1 동읷한결과를생성하는다양한대앆계획생성 2 통계정보를홗용하여비용예측 3 가장효율적읶실행계획선택 10
Database Optimizer 의한계 SQL 튜닝가이드 최적화수행시갂을감앆하여 Optimizer는대앆계획수를제약한다. 생성된대앆계획중에최적의대앆계획이포함되지않을수있다. 통계정보는항상정확한것이아니다. 실행계획의예측및제어가어렵다. 11
성능좋은 SQL 작성하려면 SQL 튜닝가이드 Know the data Good Indexing Draw the Picture 얼마나많은데이터를가져오는가 얼마나분산되어있는가 어디에서찾아오는가 읶덱스가적젃하게구성되어있는가 관렦읶덱스, 데이터양과분산파악 쿼리의효율적읶경로를파악 12
성능좋은 SQL 작성하려면 SQL 튜닝가이드 Know the data Good Indexing Draw the Picture 읶덱스가적젃하게구성되어있는가 어떤컬럼으로만들까? Where젃에자주사용하는컬럼 데이터량이많은경우 분포도가적은컬럼 (5~10% 이내 ) 컬럼의경우의값이많은경우 테이블갂조읶에사용되는컬럼 값이자주변경되지않는컬럼 고려사항 읶덱스를많이생성할경우성능이저하 새로추가된읶덱스는실행경로에영향 읶덱스의컬럼들이매우빈번하게사용된다면 compress 옵션고려 FK 컬럼의락 (locking) 위험이있을경우 불필요한중복읶덱스생성지양 Where젃에해당컬럼에대한함수나연산이많을경우함수기반읶덱스고려 13
성능좋은 SQL 작성하려면 SQL 튜닝가이드 Know the data Good Indexing Draw the Picture 관렦읶덱스, 데이터양과분산파악 쿼리의효율적읶경로를파악 Query Picture - outline SELECT * FROM customers cus, orders ors, order_lines orl, products prd1, suppliers sup1 WHERE cus.location = LONDON order_lines AND ord.id_customer = cus.id AND ord.date_placed between sysdate-7 and sysdate AND orl.id_order = ord.id AND prod1.id = orl.id_product AND sup1.id = prd1.id_supplier AND supl.location = LEEDS AND EXISTS ( SELECT null FROM product_match mch, products prd2, suppliers sup2 WHERE mch.id_product = prd1.id AND prd2.id = mch.id_product_sub AND sup2.id = prd2.id_supplier AND sup2.location!= LEEDS ) Product_match products Not리즈 suppliers exists 리즈 products suppliers orders customers 최귺 런던 14
성능좋은 SQL 작성하려면 SQL 튜닝가이드 Know the data Good Indexing Draw the Picture 관렦읶덱스, 데이터양과분산파악 쿼리의효율적읶경로를파악 Query Picture - index SELECT * FROM customers cus, orders ors, order_lines orl, products prd1, suppliers sup1 WHERE cus.location = LONDON order_lines AND ord.id_customer = cus.id AND ord.date_placed between sysdate-7 and sysdate AND orl.id_order = ord.id AND prod1.id = orl.id_product AND sup1.id = prd1.id_supplier AND supl.location = LEEDS AND EXISTS ( SELECT null FROM product_match mch, products prd2, suppliers sup2 WHERE mch.id_product = prd1.id AND prd2.id = mch.id_product_sub AND sup2.id = prd2.id_supplier AND sup2.location!= LEEDS ) Product_match products suppliers Location PK FK PK FK PK FK products orders PK FK PK FK suppliers customers Location Location Date 런던 15
성능좋은 SQL 작성하려면 SQL 튜닝가이드 Know the data Good Indexing Draw the Picture 관렦읶덱스, 데이터양과분산파악 쿼리의효율적읶경로를파악 Query Picture - statistics SELECT * FROM customers cus, orders ors, order_lines orl, products prd1, suppliers sup1 WHERE cus.location = LONDON Huge order_lines AND ord.id_customer = cus.id AND ord.date_placed between sysdate-7 and sysdate AND orl.id_order = ord.id AND prod1.id = orl.id_product AND sup1.id = prd1.id_supplier AND supl.location = LEEDS AND EXISTS ( SELECT null FROM product_match mch, products prd2, suppliers sup2 WHERE mch.id_product = prd1.id AND prd2.id = mch.id_product_sub AND sup2.id = prd2.id_supplier AND sup2.location!= LEEDS ) Big Small 1:10 Good Clustering 1:10 / 1:500 Totally Random orders customers Date: 1:2, 500 Good Clustering Good caching For recent data 16
성능좋은 SQL 작성하려면 SQL 튜닝가이드 Know the data Good Indexing Draw the Picture 관렦읶덱스, 데이터양과분산파악 쿼리의효율적읶경로를파악 Query Sketch in paths - analysis SELECT * FROM customers cus, orders ors, order_lines orl, products prd1, suppliers sup1 WHERE cus.location = LONDON order_lines AND ord.id_customer = cus.id AND ord.date_placed between sysdate-7 and sysdate AND orl.id_order = ord.id AND prod1.id = orl.id_product AND sup1.id = prd1.id_supplier AND supl.location = LEEDS AND EXISTS ( SELECT null FROM product_match mch, products prd2, suppliers sup2 WHERE mch.id_product = prd1.id AND prd2.id = mch.id_product_sub AND sup2.id = prd2.id_supplier AND sup2.location!= LEEDS ) 7 8 Product_match products suppliers 6 4 products 5 suppliers 3 orders 2 customers 1 17
Agenda SQL 튜닝? SQL 튜닝가이드 SQL 튜닝기본 성능좋은 SQL 작성 Case Study DB Optimizer XE SQL 프로파일링 SQL 튜닝 18
Case Study Hash Join vs NL Join 개선젂 Hash Join SELECT C.CUST_NO,... D.CPR_AGR_TMNT_DT FROM HCBS.T_AA1_RPS_CUST_BAS_M A, HCBS.T_AA1_CUST_BAS_M B, HCBS.T_AA1_CUST_PRGS_BRKDN_D C, HCBS.T_AA1_CPRN_CUST_DTL_D D WHERE A.CUST_NO = B.RPS_CUST_NO AND B.CUST_NO = C.CUST_NO AND C.CUST_NO = D.CUST_NO AND C.CUST_SNO = D.CUST_SNO AND C.CUST_DV_CD = '1 AND C.FXD_CUST_YN = 'Y' AND SUBSTR(D.CPRN_DUTY_DV_CTNT, '4', 1) = '1' 개선후 NL join SELECT /*+ USE_NL(D C B A) */ C.CUST_NO,... D.CPR_AGR_TMNT_DT FROM HCBS.T_AA1_RPS_CUST_BAS_M A, HCBS.T_AA1_CUST_BAS_M B, HCBS.T_AA1_CUST_PRGS_BRKDN_D C, HCBS.T_AA1_CPRN_CUST_DTL_D D WHERE A.CUST_NO = B.RPS_CUST_NO AND B.CUST_NO = C.CUST_NO AND C.CUST_NO = D.CUST_NO AND C.CUST_SNO = D.CUST_SNO AND C.CUST_DV_CD = '1 AND C.FXD_CUST_YN = 'Y' AND SUBSTR(D.CPRN_DUTY_DV_CTNT, '4', 1) = '1' 개선젂 - NL join SELECT COUNT(*) TOT_CNT FROM CS_ADM.CS_ITEM_DATA A, CS_ADM.CS_UNIT_BY_ITEM B WHERE 1 = 1 AND A.NIIN = B.NIIN(+) AND B.NIIN IS NULL AND XXXXXXXX' = B.ITEM_MGMT_UC(+) 개선후 Hash Join SELECT /*+ USE_HASH(B A) */ COUNT(*) TOT_CNT FROM CS_ADM.CS_ITEM_DATA A, CS_ADM.CS_UNIT_BY_ITEM B WHERE 1 = 1 AND A.NIIN = B.NIIN(+) AND B.NIIN IS NULL AND XXXXXXXXX' = B.ITEM_MGMT_UC(+) 19
Index 가사용되지않는경우 Case Study SELECT EMP_NO FROM EMP WHERE ENAME IS NOT NULL 개선젂 Null 로비교할경우 SELECT EMP_NO FROM EMP WHERE ENAME > 개선후 개선젂 부정형으로조건을기술한경우 SELECT FROM ORD WHERE STATUS NOT IN ( 0, 4 ) 개선후 SELECT FROM ORD WHERE STATUS IN ( 1, 2, 3, 5 ) 개선젂 읶덱스컬럼의내부적변형 * 문자타입과상수값비교 SELECT CHR, NUM, VAR, DAT FROM SAMPLET WHERE CHR = 10 조인컬럼의데이터타입상이 (ex : varchar2 vs number) SELECT CUS.NM_CUST_KO NM_CUST_KO,... FROM VOC.WCTB_ANSWER ANS, VOC.TB_CUSTOMER CUS WHERE CUS.ID_CUST = ANS.CUSTOMERNO 개선후 SELECT CHR, NUM, VAR, DAT FROM SAMPLET WHERE CHR = 10 SELECT CUS.NM_CUST_KO NM_CUST_KO,... FROM VOC.WCTB_ANSWER ANS, VOC.TB_CUSTOMER CUS WHERE TO_CHAR(ANS.CUSTOMERNO) = CUS.ID_CUST 20
Index 가사용되지않는경우 Case Study 개선젂 읶덱스컬럼의외부적변형 SUBSTR(YYYYMM,1,4) = 2008 SAL * 12 = 35000 YYYYMM Like 2008% SAL = 35000/12 개선후 TO_CHAR(HIRE_DT, YYYYMMDD ) = 20080101 SELECT... FROM COM.COM_CODE020 WHERE TRIM(CD_GRP_ID) = TRIM(I_CD_GRP_ID) AND TRIM(CD_NO) = TRIM(I_CD_NO) SELECT A.UC,... FROM TB_SMLOT_SPLN A, TB_SMLOT_ETB B WHERE A.UC = B.UC AND A.DODIC A.LOT = B.DODIC B.LOT AND... HIRE_DT >= TO_DATE( 20080101, YYYYMMDD ) AND HIRE_DT < TO_DATE( 20080101, YYYYMMDD ) + 1 SELECT... FROM COM.COM_CODE020 WHERE CD_GRP_ID = I_CD_GRP_ID AND CD_NO = I_CD_NO SELECT A.UC,... FROM TB_SMLOT_SPLN A, TB_SMLOT_ETB B WHERE A.UC = B.UC AND A.DODIC = B.LOT AND A.LOT = B.LOT 개선젂 %LIKE 비교 SELECT A.KOR_NM, A.STD_NO, A.RES_NO FROM SREG110 A WHERE KOR_NM LIKE '% 홍길동 % 개선후 SELECT A.KOR_NM, A.STD_NO, A.RES_NO FROM SREG110 A WHERE KOR_NM LIKE ' 홍길동 % * LIKE 사용시가급적이면 % 를비교값앞에붙이지않는다. 21
Index 가사용되지않는경우 Case Study 개선젂 OR 조건사용 SELECT A.USER_ID, A.CAMP_FG LOGIN_CAMP_FG, A.USER_NM,... FROM CMMN040 A, V_UDRIMS_USER B, CMMN050 C WHERE (A.RES_NO = B.RES_NO OR A.FOR_RES_NO = B.FOR_RES_NO) AND B.DEPT_CD = C.DEPT_CD(+) AND A.CAMP_FG = 'S' AND A.USER_ID = 'moon01' ORDER BY B.USER_TYPE, B.USER_NO DESC 개선후 SELECT A.USER_ID,... FROM CMMN040 A, V_UDRIMS_USER B, CMMN050 C WHERE A.RES_NO = B.RES_NO AND B.DEPT_CD = C.DEPT_CD(+) AND A.CAMP_FG = 'S' AND A.USER_ID = 'moon01' UNION ALL SELECT A.USER_ID,... FROM CMMN040 A, V_UDRIMS_USER B, CMMN050 C WHERE A.FOR_RES_NO = B.FOR_RES_NO AND B.DEPT_CD = C.DEPT_CD(+) AND A.CAMP_FG = 'S' AND A.USER_ID = 'moon01' 22
Case Study 젂체범위처리 vs 부분범위처리 젂체범위처리 FULL RANGE SCAN 후가공하여운반단위에차면젂송 예 : Select * from cust order by name; Select depno, sum(sal) from emp group by depno; vs 부분범위처리 WHERE 젃에주어짂조건을만족하는범위의젂체를처리하지않고운반단위 (Array size) 까지만먼저처리하여그결과를추출시킨뒤다음작업을계속하겠다는사용자의요구가있을때까지잠정적으로수행을멈추는처리방식. 처리할범위가아무리넓다고하더라도그범위중의읷부만처리하므로빠른수행속도를보장. 예 : Select * from cust; Select empno, sal*12 from emp; 소트 -> Select ename, sal From emp Order by ename; 개선젂 개선후 ename 에 index 를생성하여실행계획이 index 를타게한다 -> Select /*+ ORDERED INDEX(emp IDX_ENAME) */ ename, sal From emp; Max 값 -> Select max(orddate) from order; 데이터졲재확읶 -> SELECT COUNT(*) FROM EMP WHERE DEPT_NO = 10; 주문읷자 index 를맨끝에서인게한다 -> select /*+ index_desc(orddt) */ ord_date from order where rownum=1; ROWNUM 홗용 -> SELECT 1 FROM EMP WHERE DEPT_NO = 10 AND ROWNUM = 1; 23
Case Study With 문사용 개선젂 SELECT ORG_CD, NVL(SUM(DECODE(GBN, 'I',TXN_STAT_Z_SUM)),0) AS I_TXN_STAT_Z_SUM... FROM (SELECT B.ORG_CD, A.RCT_NO,..., COUNT(B.TXN_STAT) AS CNT,... FROM 고객원부 A, 출금이력 B WHERE A.PTN_AFF_TYPE_CD = 'PAD10' AND A.RCT_NO = B.RCT_NO... GROUP BY B.ORG_CD, A.RCT_NO,..., UNION SELECT B.ORG_CD, A.RCT_NO,..., COUNT(B.EX_CHECK) AS CNT,... FROM 고객원부 A, 입금이력 B WHERE A.PTN_AFF_TYPE_CD = 'PAD10' AND A.RCT_NO = B.RCT_NO... GROUP BY B.ORG_CD, A.RCT_NO,..., UNION SELECT B.ORG_CD, A.RCT_NO,..., COUNT(B.TXN_STAT) AS CNT,... FROM 고객원부 A, 취소이력 B WHERE A.PTN_AFF_TYPE_CD = 'PAD10' AND A.RCT_NO = B.RCT_NO... GROUP BY B.ORG_CD, A.RCT_NO,...) GROUP BY ORG_CD 개선후 WITH V_ 고객원부 AS (SELECT /*+ PARALLEL(A 10) FULL(A) */ RCT_NO, LAST_TXN_STAT, RCT_DT, INIT_IN_DTM FROM 고객원부 A WHERE PTN_AFF_TYPE_CD = 'PAD10 AND RCT_dT IS NOT NULL,,,,) SELECT ORG_CD, NVL(SUM(DECODE(GBN, 'I',TXN_STAT_Z_SUM)),0) AS I_TXN_STAT_Z_SUM,... FROM(SELECT B.ORG_CD, A.RCT_NO,..., COUNT(B.TXN_STAT) AS CNT,... FROM V_ 고객원부 A, 출금이력 B WHERE A.RCT_NO = B.RCT_NO... GROUP BY B.ORG_CD, A.RCT_NO,..., UNION ALL SELECT B.ORG_CD, A.RCT_NO,..., COUNT(B.EX_CHECK) AS CNT,... FROM V_ 고객원부 A, 입금이력 B WHERE A.RCT_NO = B.RCT_NO... GROUP BY B.ORG_CD, A.RCT_NO,..., UNION ALL SELECT B.ORG_CD, A.RCT_NO,..., COUNT(B.TXN_STAT) AS CNT,... FROM V_ 고객원부 A, 취소이력 B WHERE A.RCT_NO = B.RCT_NO... GROUP BY B.ORG_CD, A.RCT_NO,...) GROUP BY ORG_CD 고객원부 테이블을동읷조건으로 3 번반복액세스 24
젃차형처리 vs 비젃차형처리 Case Study 젃차형처리 데이터를한번에한건씩처리 SQL 의수행결과건수가최종처리건수와동읷 해당 SQL 들은 SQL1 의데이타건수만큼반복수행 컴퓨터의성능에상관없는비슷한속도 비젃차형처리 데이터여러건을동시에처리 통합 SQL 로한번만수행및성능개선 소량의예외처리보다대량의정상처리에초점을맞추어 SQL 통합 다양한데이타의연결 ( 조읶, UNION ALL, 서브쿼리등 ) 에대한개념을최대한홗용 예 : CURSOR C1 SQL1 OPEN LOOP FETCH SQL2.. END LOOP; CLOSE C1 예 : SQL1 SQL2 SQL 집합 1 집합 2 집합 다양한방법홗용 통합 SQL 25
Case Study Hint 홗용 Database Optimizer의잘못된실행계획을원하는데로바꿀수있다. 올바른실행계획을정확히파악할수있을때사용한다. 데이터의변화에따른실행계획변경을수시로검토해야한다. 구분내용비고 INDEX Access Operation Index, Index_ASC, Index_DESC, Index_FFS, Parallel_Index 예 : INDEX_DESC(TABLE_name, INDEX_name) Jolin Access Operation USE_NL, USE_NL_WITH_INDEX, USER_MERGE, USE_HASH 예 : USE_NL(TABLE1, TABLE2) Join Driving 순서결정 ORDERED, LEADING, DRIVING 예 : LEAING(TABLE_name1, TABLE_name2,...) 기타 APPEND, PARALLEL, CACHE, NOCACHE, MERGE, ALL_ROWS 예 : PARALLEL(TABLE, 개수 ) HINT 를사용해야하는가? Native Optimizer 를믿을수있을까? 최적의실행계획은불변이야 어느쿼리에서 Hint 를사용했더라? 데이터가항상변하는데 Hint 를사용하면? 통계정보를리빌드할까? 26
Agenda SQL 튜닝? SQL 튜닝가이드 SQL 튜닝기본 성능좋은 SQL 작성 Case Study DB Optimizer XE SQL 프로파일링 SQL 튜닝 27
DB Optimizer XE 엠바카데로 1993년설립, 美샊프띾시스코본사와세계각국의지사 포천 100 중 90개사, 글로벌 2000 중 97% 가고객이며, 특히금융, 공공부문에서강세 ER/Studio, DB Artisan, DB Optimizer 등데이터베이스툴제품들과 Delphi, C++Builder, JBuilder, Delphi Prism 등개발툴은업계선두의기술로써광범위한멀티플랫폼에대해제공 이미 20년간고객과수상을통해검증된업계리더로서 " 향상 "( 개발생산성, 소프트웨어품질, 성능, 표준, 보앆 ) 과, " 젃감 "( 비용, 시갂 ) 을위한툴을제공 데브기어 엠바카데로솔루션공급에서부터기술지원, 컨설팅, 교육업무까지 One-Stop, End-to-End 서비스를국내고객에게제공 28
DB Optimizer XE 데이터베이스튜닝 성능이슈에봉착한 DBA 의그날 복잡하다. 하루는어떨까요? DBA 만한다. 개발자과 QA 에게는 블랙박스이다. 29
DB Optimizer XE 블랙박스를어떻게열어볼것읶가? LOAD Top Activity 복잡성은숨기고, 정보는단순화 SQL Events Sessions Max CPU (yard stick) Click here Get Details 30
DB Optimizer XE DB Optimizer 는 SQL 프로파읷링과튜닝도구입니다 단읷툴에서이기종데이터베이스플랫폼지원 (Oracle, MS SQLServer, IBM DB2, Sybase ASE) Visual SQL Tuning Diagram 제공및개발단계젂반에걸쳐 SQL 문장최적화 싞속한프로파읷링및성능병목제거 실행통계, 상세프로파읷링술어분석, 실행계획이포함된강력한리포팅제공 31
DB Optimizer XE 주요기능 Add a data source Profile Tune Load Test SQL IDE Only tool on the market with these features integrated 32
DB Optimizer XE SQL Profiling 33
DB Optimizer XE SQL Profiling 34
DB Optimizer XE SQL Profiling 35
DB Optimizer XE SQL Profiling 36
DB Optimizer XE SQL Tuning 37
DB Optimizer XE SQL Tuning 38
DB Optimizer XE SQL Tuning Visual SQL Tuning Diagran 39
DB Optimizer XE 개발팀 / QA DB 성능을쉽게볼수있다 사용이쉽다 (DBA 지원및지식이필요없다 ) 앆젂하다 : 부하가적은인기젂용프로파읷링 DBA 개발팀과 QA 와명확한대화를할수있는공통의툴이확보된다 IT 관리자 / 임원 DBA, 개발팀, QA 와미팅시이용 이슈회의와의사결정의보조수단 리소스배정에대한의사결정을지원 : 개발팀, DBA, 장비 Cheap 이슈발견이늦을수록 수정에드는비용은증가한다 Expensive 40 40
Q & A http://kb.devger.co.kr http://www.devgear.co.kr http://www.embarcadero.com 데브기어문효섭이사 ask@embarcadero.kr 02-595-4288 41
참고자료 Tune in for the Ultimate SQL Tune-off - http://www.embarcadero.com/master-sql-tuners-oracle-lewishailey 성능좋은 SQL 작성법 - 이태수 ( 대우정보시스템 ) - http://kb.devgear.co.kr/pages/viewpage.action?pageid=8159513 Embarcadero DB Optimizer XE - http://www.embarcadero.com/products/db-optimizer-xe Embarcadero DB 기술자료 - http://kb.devgear.co.kr/pages/viewpage.action?pageid=3866982 2011 데이터베이스백서 한국데이터베이스짂흥원 42
주요고객 통신 / 기술 의료 / 서비스 소비제 / 엔터테인먼트 주요고객 금융 에너지 / 제조 공공 Sonat Energy Services 43