1. 들어가며 많은기업들이정보시스템의근간으로데이터베이스를사용하고있고또많은사람들이데이터베이스의성능에대해불만을토로한다. 데이터베이스의성능문제와관련해많은원인과해결책이있지만이문제와관련해자주언급되는개념이있다. Hard Parsing 이그것이다. Hard Parsing 은성능에좋

Size: px
Start display at page:

Download "1. 들어가며 많은기업들이정보시스템의근간으로데이터베이스를사용하고있고또많은사람들이데이터베이스의성능에대해불만을토로한다. 데이터베이스의성능문제와관련해많은원인과해결책이있지만이문제와관련해자주언급되는개념이있다. Hard Parsing 이그것이다. Hard Parsing 은성능에좋"

Transcription

1 Hard Parsing 에따른성능문제와효과적인 SQL 작성법 SpeedGate Consulting 김철각

2 1. 들어가며 많은기업들이정보시스템의근간으로데이터베이스를사용하고있고또많은사람들이데이터베이스의성능에대해불만을토로한다. 데이터베이스의성능문제와관련해많은원인과해결책이있지만이문제와관련해자주언급되는개념이있다. Hard Parsing 이그것이다. Hard Parsing 은성능에좋지못한영향을준다는기술문서들은상당히많다. 하지만아직도많은사람들이 Hard Parsing 이라는것이어떤것이고왜, 어떻게나쁜것인지정확히인식하고있지못한것같다. 여러기업체에서데이터베이스성능개선활동을수행하다보면 Hard Parsing 을유발하도록프로그램을개발한개발자들도그것이얼마나문제를유발하는지를알지못한다. 그렇기때문에 Hard Parsing 을유발하는프로그램이만들어지고이것이문제를일으키는경우를많이보았다. 이문서에서 Parsing 이라는작업이무엇이고그중에서 Hard Parsing 이얼마나성능에영향을미치는지를알아보도록하겠다. 하지만이문서에서는단순히개발툴에서 Hard Parsing 을하지않도록프로그램을작성하는방법에대한논의는다루지않을예정이며구조적으로 Hard Parsing 을하는몇가지프로그램을통해보다효율적인 SQL 작성법에대한논의를하려고한다.

3 2. Parsing 과 Shared Pool Parsing Parsing 이란사용자가수행을요청한 SQL 문을 Database 에서실행가능한형태로변경하기위해수행하는일련의과정을일컫는다. Parsing 은크게 Sort Paring 과 Hard Parsing 으로나누어질수있는데 Hard Parsing 의경우더많은시스템자원을사용하게된다. Parsing 이라는작업은실제로사용자의요구사항을처리하는단계가아닌, 준비단계로서사용자입장에서는 Overhead 로간주될수있는부분이다. 하지만다음장에언급되듯이 Parsing 작업은내부적으로상당히많은일을수행할수있으며이에따라 CPU 를비롯한시스템자원의사용과그에해당하는만큼의시간을사용하기때문에 Parsing 작업에소요되는시간은가능한최소화되어야한다. 오라클에서는 Shared Pool 이라는공간을이용해이문제를해결하고있는데 Parsing 시많은비용이소요되는일련의작업을수행결과생성한정보를버리지않고공유메모리에보관해두었다가차후동일한 SQL 문이사용자에의해요청될경우 Parsing 작업을다시하지않고공유메모리에보관된정보를이용해 실행 함으로써전체수행속도를빠르게하고보다많은 CPU 자원이실제자료처리에사용될수있도록하고있다. Shared Pool Parsing 을설명하며언급한공유메모리가 Shared Pool 이다. Shared Pool 은 SGA 를구성하고있는부분으로크게 dictionary cache 와 library cache 로구성된다. dictionary cache data dictionary 정보를보관하는메모리영역. SQL 문에대한 parsing 작업또는 PL/SQL 코드에대한 Compile 작업시이부분의내용을참조한다. library cache SQL 또는 PL/SQL 코드의실행가능한형태를보관하는메모리영역. Application 에서사용하는 SQL, PL/SQL 문이사용한다. 오라클에서수행되는 SQL 문과 Parsing 된정보를공유하기위해 Shared Pool 의 library cache 영역을사용한다. 오라클서버가 SQL 문에대한수행요청을받은경우 library cache 영역에수행하려는 SQL 문에대한 parsing 된형태가있는지를조사하고그형태가존재하는경우 (library cache hit) 그정보를사용하는데이를 soft parse 라고한다. 만일수행하려는 SQL 문이 library cache 영역에존재하지않는경우 (library cache miss) 새로 parsing 작업을수행하며이를 hard parse 라한다. 그러므로 SGA 영역중 Buffer Cache 가 Disk I/O 에대한 Cache 자원으로사용되는것처럼, Shared Pool 은 Parsing 에소요되는 CPU Power 에대한 Cache 라고생각할수있다.

4 3. SQL문수행절차 SQL 문수행은크게다음과같은절차로이루어진다. Parse : SQL 문에대해문법, Object 존재여부, 권한등의검사를수행한다. 또한 SQL 문에대한최적의실행방법을결정 Execute : 실제자료처리가발생하는부분으로다양한사용자의요구가이루어짐 Fetch : Select 문장의경우처리된자료가사용자에게보내지는과정위의 3 가지수행단계는 trace 의결과에서도나타나는단계로가장기본적인수행단계라고할수있다. 여기서는 Execute 나 Fetch 단계보다는 Parse 에관심을두고있으므로 Parse- Execute 단계에서발생하는일들을조금더자세히살펴보기로하자. Soft Parse Hard Parse Parse 필요? Hash 값계산 Shared Pool NO 에동일값존재? YES Object 가동일? NO Lock SQL Area YES Parse SQL SQL 실행 SQL Area 에저장 그림 1.. Parse Step 개요 위의그림에서 Hard Parse 로표시되는다음과같은절차로이루어진다. (Local Node 에서작업하는경우 ) SQL 문에대한변환및문법검증 Data Dictionary 를통해 SQL 문에서사용되는 Table 과 Column 정보검색 SQL 문에서사용되는 Object 들이 Parsing 과정중변경되는일을방지하기위해관련 Object 들에 Lock 설정.

5 참조되는 Object 들에대해 SQL 문에서요구한작업에대한권한유무점검. SQL 문에대한최적의실행계획생성. 산출된정보들을 library cache 에저장. 최적의실행계획생성단계는매우복잡한계산을거치게되는데이과정에서는 ( 가능한경우 ) Database 의 Parameter, Table/Index 의통계정보등을이용해여러가지경우 (Table Join 순서및방법, Table Scan 및 Index Scan) 에대해실행계획을생성하고이들중최적의실행계획을얻어낸다. 이부분은계산및처리과정이많으므로 Parsing 작업중가장많은 CPU 자원을사용하는부분이라고할수있다. 이부분에서구체적으로수행하는일들은 Event 에대해 Trace 를설정하면볼수있으며 Reference 에기술된 Site 의문서를보면보다구체적인정보를얻을수있다.

6 4. Literal SQL vs Bind SQL Literal SQL : SQL 문의내용중특정값을지정하거나, 표현하는부분에문자, 숫자와같은상수값을 Hard 코딩해서작성한 SQL Bind SQL : SQL 문의내용중특정값을지정하거나, 표현하는부분에변수를이용해작성한 SQL 다음표의내용을 SQL*Plus 수행하면수행된 SQL 문이화면에표시된다. Literal SQL 문은변수가값으로서 (Literal) 사용되었으나 Bind SQL 문은변수가변수자체로사용되었다. 그렇기때문에 Literal SQL 문은각 SQL 문마다 1 부터 4 까지의값이값으로서사용된반면 Bind SQL 문은 :b0 라는변수이름이반복사용되고있다. Literal SQL Bind SQL set serveroutput on declare v_sql varchar2(1000); v_cnt number; begin for i in 1..4 loop v_sql:='select count(*) from user_objects where rownum<=' i; dbms_output.put_line(v_sql); execute immediate v_sql into v_cnt; end loop; end; / ** 결과로수행되는 SQL select count(*) from user_objects where rownum<=1 select count(*) from user_objects where rownum<=2 select count(*) from user_objects where rownum<=3 select count(*) from user_objects where rownum<=4 set serveroutput on declare v_sql varchar2(1000); v_cnt number; begin for i in 1..4 loop v_sql:='select count(*) from dba_objects where rownum<=:b0'; dbms_output.put_line(v_sql); execute immediate v_sql into v_cnt using i; end loop; end; / ** 결과로수행되는 SQL select count(*) from dba_objects where rownum<=:b0 select count(*) from dba_objects where rownum<=:b0 select count(*) from dba_objects where rownum<=:b0 select count(*) from dba_objects where rownum<=:b0 표 1.. Literal SQL 과 Bind SQL

7 앞에서 Shared Pool 의사용목적이동일한 SQL 문에대한 Parsing 정보를재활용하기위함이라고했으나 Literal SQL 문으로사용하면조건에사용된값이서로틀리므로오라클이동일한 SQL 문으로인식하지않으므로새롭게 Parsing 을 Hard Parsing 을 수행하게된다. 앞에서 Hard Parsing 이자원을상당히많이사용한다고언급했다. 얼마나많이사용하는지를확인하기위해다음과같은 Test 를수행하였다. 본 Test 에사용된 Object 들은 Oracle 9i 에포함된 demo schema 중 SH Schema 의 Object 를사용하였다. Test 환경 H/W : Pentium 4 1.4GHz RAM : 512MB OS : Windows XP Professinal Oracle Version : Oracle9i E/E SGA Total System Global Area bytes Fixed Size bytes Variable Size bytes Database Buffers bytes Redo Buffers bytes Test Script ** CASE 1. Literal SQL declare v_prod_name v_unit_price varchar2(50); number; begin end; / v_sql varchar2(500); v_sql:='select /* literal */ prd.prod_name,cost.unit_price from sh.products prd, sh.costs cost where prd.prod_id=cost.prod_id(+) and cost.time_id(+)=to_date('' '',''yyyymmdd'') and prd.prod_id='; for i in loop execute immediate v_sql i*5 into v_prod_name,v_unit_price; end loop; ** CASE 2. Bind SQL declare v_prod_name v_unit_price begin varchar2(50); number; for i in loop select /* bind */ prd.prod_name,cost.unit_price into v_prod_name,v_unit_price from sh.products prd, sh.costs cost where prd.prod_id=cost.prod_id(+) and cost.time_id(+)=to_date(' ','yyyymmdd') and prd.prod_id=i*5; end loop;

8 end; / 다음은 Windows 작업관리자를통해측정한각각의 CPU 사용률과 SQL*Plus 에서표시된 경과시간이다. Case1 경과시간 : 초소요 Case2 경과시간 : 1.00 초소요 다음은 v$sql performance view 에서추출한수행횟수및 Memory 사용정보이다. Case1 Case2 select substr(sql_text,1,20),avg(sharable_mem),count(*),max(executions) from v$sql where lower(sql_text) like 'select /* literal */%' group by substr(sql_text,1,20); SUBSTR(SQL_TEXT,1,20) AVG(SHARABLE_MEM) COUNT(*) MAX(EXECUTIONS) select /* literal */ select substr(sql_text,1,20),avg(sharable_mem),count(*),max(executions) from v$sql where lower(sql_text) like 'select /* bind */%' group by substr(sql_text,1,20); SUBSTR(SQL_TEXT,1,20) AVG(SHARABLE_MEM) COUNT(*) MAX(EXECUTIONS) SELECT /* bind */ pr SQL 문은 10,000 번수행됐으나 Case1 에나타난정보는 2,112 개만존재하는것으로표시된다. 이는 Shared Pool 의크기가 10,000 개의 SQL 문을저장할수없어먼저수행된 SQL 문은공간 확보를위해 Shared Pool 에서삭제되었음을표시한다. 또공유가전혀되지않으므로 수행횟수를표시하는 execution 값의최대값은 1 을표시하고있다. SQL 문 1 개가사용하는

9 Sharable Memory 의크기는약 16KB 이므로 10,000 개의 SQL 문에대한정보를다보관하는경우 160MB 의공간이필요하다는계산이나온다. 반면 Case2 는단 1 개의형태만존재하고있으며그것이 10,000 번사용됐음을보여주고있다. 하지만사용하는 Memory 량은여전히 16KB 이므로 Case1 의 160MB 와비교하면엄청난차이를보이고있다. 동일한일을수행하는 SQL 문을 Literal SQL 과 Bind SQL 로작성한경우 Computing 자원의주요 Resource 인 CPU 와 Memory 를사용하는형태에서상당한차이가발생한다는것을보았다. 그러면오라클내부적으로는또어떤차이가있을까? 다음장에서몇가지경우에대한소요시간및자원사용량을알아보기로하자.

10 5. 7 가지 PARSE 형태별자원사용량비교 Parsing 시얼마나많은자원과시간이소요되는지를알아보기위해다음과같은 TEST 를수행하였다. 앞서사용한것과마찬가지로 Oracle 9i 에포함된 demo schema 중 SH Schema 의 Object 를사용하였다. 이들 Object 들은 $ORACLE_HOME/demo/schema 에존재하는 mksample.sql 을수행해생성할수있다. Cursor 를선언하고실행하기까지의구현방법에꽤많은경우의수로구분할수있으나모든경우에대한 Test 는지면관계상어려우므로다음과같은형태로수행한경우의자원사용량을비교하였다. Case 1. Execute immediate 를사용한 Literal SQL Case 2. DBMS_SQL 을사용한 Literal SQL Case 3. cursor_sharing=force 설정후 Execute immediate 를사용한 Literal SQL Case 4. Execute immediate 를사용한 Bind SQL Case 5. DBMS_SQL 을사용한 Bind SQL(Open, Parse 1 회, Bind, Execute 반복 ) Case 6. Static SQL Case 7. DBMS_SQL 을사용한 Bind SQL(Open 1 회, Parse, Bind, Execute 반복 ) Test 환경 H/W : Pentium 4 1.4GHz RAM : 512MB OS : Windows XP Professinal Oracle Version : Oracle9i E/E SGA Total System Global Area bytes Fixed Size bytes Variable Size bytes Database Buffers bytes Redo Buffers bytes Test 방식 PC 에설치된 Oracle Server 에서 Script 수행용 Session 1 개와 Performance 정보수집용 Session 1 개만접속하였다. Script 수행용 Session 에서는경과시간을표시하기위해 set timing on 을수행하였으며 Performance 정보수집을위해서 v$sesstat, v$latch 값을 Script 수행전, 후로구해그차이를기록하였다. 각각의 Test 수행전 shared pool 에대한 flush 를수행해 Parsing 과관련해다른 Test 에서생성된정보를삭제하였다. Test Script ** CASE 1. Literal SQL (Native Dynamic SQL) declare

11 v_prod_name varchar2(50); v_prod_list_price number; v_unit_price number; begin end; / v_sql varchar2(500); v_sql:='select prd.prod_name,prd.prod_list_price,cost.unit_price from sh.products prd, sh.costs cost where prd.prod_id=cost.prod_id(+) and cost.time_id(+)=to_date('' '',''yyyymmdd'') and prd.prod_id='; for i in loop execute immediate v_sql i*5 into v_prod_name,v_prod_list_price,v_unit_price; end loop; ** CASE 2. Literal SQL (DBMS_SQL) declare v_prod_name varchar2(50); v_prod_list_price number; v_unit_price number; begin end; / v_sql cur_sql_exec ignore varchar2(500); number; number; cur_sql_exec:=dbms_sql.open_cursor; v_sql:='select prd.prod_name,prd.prod_list_price,cost.unit_price from sh.products prd, sh.costs cost where prd.prod_id=cost.prod_id(+) and cost.time_id(+)=to_date('' '',''yyyymmdd'') and prd.prod_id='; for i in loop dbms_sql.parse(cur_sql_exec,v_sql i*5,1); dbms_sql.define_column(cur_sql_exec,1,v_prod_name,50); dbms_sql.define_column(cur_sql_exec,2,v_prod_list_price); dbms_sql.define_column(cur_sql_exec,3,v_unit_price); ignore:=sys.dbms_sql.execute(cur_sql_exec); ignore:=sys.dbms_sql.fetch_rows(cur_sql_exec); dbms_sql.column_value(cur_sql_exec,1,v_prod_name); dbms_sql.column_value(cur_sql_exec,2,v_prod_list_price); dbms_sql.column_value(cur_sql_exec,3,v_unit_price); end loop; dbms_sql.close_cursor(cur_sql_exec); ** CASE 3. Cursor Sharing 에의한공유 alter session set cursor_sharing = force; declare

12 v_prod_name varchar2(50); v_prod_list_price number; v_unit_price number; begin end; / v_sql varchar2(500); v_sql:='select prd.prod_name,prd.prod_list_price,cost.unit_price from sh.products prd, sh.costs cost where prd.prod_id=cost.prod_id(+) and cost.time_id(+)=to_date('' '',''yyyymmdd'') and prd.prod_id='; for i in loop execute immediate v_sql i*5 into v_prod_name,v_prod_list_price,v_unit_price; end loop; alter session set cursor_sharing = exact; ** CASE 4. Bind 변수사용 (Native Dynamic SQL) declare v_prod_name varchar2(50); v_prod_list_price number; v_unit_price number; v_sql varchar2(500); begin v_sql:='select prd.prod_name,prd.prod_list_price,cost.unit_price from sh.products prd, sh.costs cost where prd.prod_id=cost.prod_id(+) and cost.time_id(+)=to_date('' '',''yyyymmdd'') and prd.prod_id='; for i in loop execute immediate v_sql ':b1' into v_prod_name,v_prod_list_price,v_unit_price using i*5; end loop; end; / ** CASE 5. Bind 변수사용 (DBMS_SQL) declare v_prod_name v_prod_list_price number; v_unit_price number; varchar2(50); begin v_sql cur_sql_exec ignore varchar2(500); number; number; cur_sql_exec:=dbms_sql.open_cursor; v_sql:='select prd.prod_name

13 end; /,prd.prod_list_price,cost.unit_price from sh.products prd, sh.costs cost where prd.prod_id=cost.prod_id(+) and cost.time_id(+)=to_date('' '',''yyyymmdd'') and prd.prod_id='; dbms_sql.parse(cur_sql_exec,v_sql ':b0',1); for i in loop dbms_sql.define_column(cur_sql_exec,1,v_prod_name,50); dbms_sql.define_column(cur_sql_exec,2,v_prod_list_price); dbms_sql.define_column(cur_sql_exec,3,v_unit_price); dbms_sql.bind_variable(cur_sql_exec,'b0',i*5); ignore:=sys.dbms_sql.execute(cur_sql_exec); ignore:=sys.dbms_sql.fetch_rows(cur_sql_exec); dbms_sql.column_value(cur_sql_exec,1,v_prod_name); dbms_sql.column_value(cur_sql_exec,2,v_prod_list_price); dbms_sql.column_value(cur_sql_exec,3,v_unit_price); end loop; dbms_sql.close_cursor(cur_sql_exec); ** CASE 6. Static SQL declare begin end; / v_prod_name varchar2(50); v_prod_list_price number; v_unit_price number; for i in loop select prd.prod_name,prd.prod_list_price,cost.unit_price into v_prod_name,v_prod_list_price,v_unit_price from sh.products prd, sh.costs cost where prd.prod_id=cost.prod_id(+) and cost.time_id(+)=to_date(' ','yyyymmdd') and prd.prod_id=i*5; end loop; ** CASE 7. Bind 변수사용 (DBMS_SQL) + 반복 PARSE declare begin v_prod_name varchar2(50); v_prod_list_price number; v_unit_price number; v_sql cur_sql_exec ignore varchar2(500); number; number; cur_sql_exec:=dbms_sql.open_cursor; v_sql:='select prd.prod_name,prd.prod_list_price,cost.unit_price from sh.products prd, sh.costs cost where prd.prod_id=cost.prod_id(+) and cost.time_id(+)=to_date('' '',''yyyymmdd'')

14 end; / and prd.prod_id='; for i in loop dbms_sql.parse(cur_sql_exec,v_sql ':b0',1); dbms_sql.define_column(cur_sql_exec,1,v_prod_name,50); dbms_sql.define_column(cur_sql_exec,2,v_prod_list_price); dbms_sql.define_column(cur_sql_exec,3,v_unit_price); dbms_sql.bind_variable(cur_sql_exec,'b0',i*5); ignore:=sys.dbms_sql.execute(cur_sql_exec); ignore:=sys.dbms_sql.fetch_rows(cur_sql_exec); dbms_sql.column_value(cur_sql_exec,1,v_prod_name); dbms_sql.column_value(cur_sql_exec,2,v_prod_list_price); dbms_sql.column_value(cur_sql_exec,3,v_unit_price); end loop; dbms_sql.close_cursor(cur_sql_exec); Test 결과 Stat Latch (get) 구 분 Case 1 Case 2 Case 3 Case 4 Case 5 Case 6 Case 7 소요시간 execute count recursive calls parse count (total) parse count (hard) parse time cpu parse time elapsed opened cursors cumulative CPU used by this session library cache shared pool row cache objects 결과는크게 3 가지부분으로구분되며다음과같은의미를갖는다. 소요시간 : SQL*Plus 에서 set timing on 을수행한후각작업이종료된후표시되는시간. 실제로 Database 에서수행되는것과약간의오차가있을수있으나 Trace 를수행한경우본 Test 환경의 File System 으로부터의 Overhead 가매우크게발생해실제값자체를상당히왜곡시키기때문에이지표를사용했다. 하지만, 이지표는절대적으로신뢰할수있는값은아니며특히소수점이하로는오차가클수있기때문에단순참고용으로기재했다. exeute count : 각 Operation 수행을위해처리된 SQL 문의개수. recursive calls : Oracle 이내부적으로요구되는작업을수행하기위해수행한횟수와 PL/SQL 에서호출된 SQL 문의횟수이다. 내부적으로요구되는작업은 Hard Parsing 시내부적으로사용되는 SQL 문으로볼수있으며나머지는 PL/SQL 문에서수행되는횟수로볼

15 수있다. execute count 와 recursive calls 모두자료수집방법에따라조금다른결과를보여주므로여기서는절대적인지표에대해언급하기보다는상대적인지표로언급한다. parse count (total) : 작업수행중발생한 Parse Count (Hard Parse + Soft Parse) parse count (hard) : 작업수행중발생한 Hard Parse Count parse time cpu : Parsing 작업시소요된 CPU Time. Centi-second(1/100 초 ) 단위로표시되지만측정방식의한계로인해약간의오차가존재할수있다. parse time elapsed : Parsing 작업시소요된경과시간. Centi-second(1/100 초 ) 단위로표시된다. CPU used by this session : 사용자의요청이시작해서종료될때까지사용된 CPU 시간. Centi-second(1/100 초 ) 단위로표시되지만측정방식의한계로인해약간의오차가존재할수있다. library cache : library cache latch 에접근한횟수를나타낸다. 몇가지요인이영향을미칠수있으나본 Test 에서는 (Hard) Parse Count 가변동요인이므로이들값의변화량에대한변동값을측정할수있다. shared pool : shared pool latch 에접근한횟수를나타낸다. row cache objects : row cache objects latch 에접근한횟수를나타낸다. 이상의 Test 결과 Parse 횟수, 특히 Hard Parse 횟수가많을수록수행시간및 Latch Access 횟수가많아진다는사실을알수있다. 사용하는 SQL 문의복잡도에따라다르지만본 Test 에서는수행시간이최대 16 배의차이가나는것으로나타났다. 또한주요 Latch 에대한접근횟수또한최대 220 배가량의차이가나는것으로나타나 Case 5, Case 6 과같은식의프로그램이다른방식보다우수하다는것을알수있다. Test 결과에의하면어떤방법을사용하던 Literal SQL 문을사용해 Hard Parse 가많을경우 Latch 자원 특히 row cache objects latch 에대한상당한 Access 와 Performance 의저하현상이발생하는것을알수있다. 또한 Case 5 과 Case 7 을통해 Hard Parse 를최소화하더라도 Soft Parse 가많으면성능에 특히 Latch 자원에 문제를줄수있다는것을알수있다. 또한 execute immediate 에의해수행되는 NDS(Native Dynamic SQL) 문의경우 cursor 를 SQL 문 1 개수행시 Cursor 를반복적으로 Open 한다는것을 opened cursors cumulative 값을통해알수있으며 DBMS_SQL Package 에비해사용하기편하다는장점이있지만 Cursor Open 을불필요하게많이수행한다는것을알수있다. Case5 와 Case6 의경우어느방법이우수한지는본 Test 만으로판단하기는어렵다. 일반적으로 Case6 가조금더우수할것으로보이지만 library cache latch 의 Access 횟수가 Case5 보다더크기때문에 library cache latch 가심하게문제가되는경우라면 Case5 가우수할수있다. 한가지분명한점은 Case5 와 Case6 의경우 Dynamic SQL 과 Static SQL 로분명히구분되는영역이존재한다는사실이다. 때문에 Dynamic SQL 을사용한다면 DBMS_SQL Package 를사용하는것이유리하며 Static SQL 을사용한다면복잡한 DBMS_SQL Package 를사용하기보다는위와같은방식으로사용하는것이합리적이지않을까생각한다.

16 다음에는실무에서발생한 Literal SQL 문사례와그에따른성능문제그리고해결사례를소개하려고한다. 하지만단순히개발 Tool 에서 Bind SQL 문을사용하는방법을알지못해 Literal SQL 문이사용된사례는지양하고자하며구조적인문제에서발생하는문제들에대해다루도록하겠다.

17 6. Literal SQL 해결사례 본절에서는전장에서언급한대로 Logic 구성, 또는구조적문제에서발생하는 3 가지의사례를통해진행하고자한다. 사례에서사용되는자료는 Oracle 9i 에포함된 demo schema 를통해구현하였다. 제한된자료를통해구현했으므로실제업무적인내용에서는좀미진할수있으므로많은양해바란다. 각각의 Test 는 SQL 문수행전 Shared Pool 을 Flush 한후수행되었다. 6.1 Loop 구조로반복수행되는 Literal SQL 본프로그램은 sh 스키마의 product table 내용중 category 가 men 또는 women 이며현재 재고가있는 ( available, on stock ) 제품중가격이 100 달러가넘는것은판매금액과판매량을 구하고, 100 달러가되지않은것은판매금액만구하는 logic 이다. 01 declare 02 v_sql varchar2(1000); 03 type refcurtype is ref cursor; 04 cur_sql refcurtype; 05 cursor cur_products is 06 select prod_id,prod_name,prod_list_price 07 from sh.products 08 where prod_status = 'available, on stock' 09 and prod_category in ('Men','Women'); 10 rec_products cur_products%rowtype; 11 v_amount_sold number; 12 v_quantity_sold number; 13 begin open cur_products; 16 loop 17 fetch cur_products into rec_products; 18 exit when cur_products%notfound; 19 if rec_products.prod_list_price>100 then 20 v_sql:='select sum(amount_sold),sum(quantity_sold)*' rec_products.prod_list_price ' from sh.sales where time_id>=to_date('' '',''yyyymmdd'') and time_id<to_date('' '',''yyyymmdd'') and prod_id=' rec_products.prod_id; 21 else 22 v_sql:='select sum(amount_sold),0 from sh.sales where time_id>=to_date('' '',''yyyymmdd'') and time_id<to_date('' '',''yyyymmdd'') and prod_id=' rec_products.prod_id; 23 end if; 24 open cur_sql for v_sql; 25 fetch cur_sql into v_amount_sold,v_quantity_sold; dbms_output.put_line('amount SOLD : ' v_amount_sold ', QUANTITY SOLD : ' v_quantity_sold); 27 close cur_sql; 28 end loop; 29 close cur_products; 30 end;

18 본프로그램을수행시키면 cur_products cursor 의자료개수만큼 hard parsing 이발생한다. 왜 그럴까? 20 line 과 22 line 에서 select 문장을문자열로처리하고있음을알수있다. 이경우 rec_products.prod_id 라는변수는상수화되어 shared pool 의입장에서는서로다른 SQL 문으로수행되기때문이다. 실무에서사용하는개발툴의종류를불문하고이런식의 프로그램방식이많이사용된다. Literal SQL 문과관련한문제해결방법은보통 2 가지가있다고생각한다. 첫번째는반복 수행되는 SQL 문이 Bind SQL 문을사용하도록변경하는것이고두번째는 SQL 문을통합해반복 수행하는부분자체를없애는방법이그것이다. 다음의 Source 는각각 Bind SQL 문을사용한경우와 SQL 문을통합한경우를보여주고있다. 01 declare 02 v_sql varchar2(1000); 03 type refcurtype is ref cursor; 04 cur_sql refcurtype; 05 cursor cur_products is 06 select prod_id,prod_name,prod_list_price 07 from sh.products 08 where prod_status = 'available, on stock' 09 and prod_category in ('Men','Women'); 10 rec_products cur_products%rowtype; 11 v_amount_sold number; 12 v_quantity_sold number; 13 begin 14 open cur_products; 15 loop 16 fetch cur_products into rec_products; 17 exit when cur_products%notfound; 18 if rec_products.prod_list_price>100 then 19 v_sql:='select sum(amount_sold),sum(quantity_sold)*:b0 from sh.sales where time_id>=to_date('' '',''yyyymmdd'') and time_id<to_date('' '',''yyyymmdd'') and prod_id=:b1'; 20 open cur_sql for v_sql using rec_products.prod_list_price,rec_products.prod_id; 21 else 22 v_sql:='select sum(amount_sold),0 from sh.sales where time_id>=to_date('' '',''yyyymmdd'') and time_id<to_date('' '',''yyyymmdd'') and prod_id=:b1'; 23 open cur_sql for v_sql using rec_products.prod_id; 24 end if; 25 fetch cur_sql into v_amount_sold,v_quantity_sold; dbms_output.put_line('amount SOLD : ' v_amount_sold ', QUANTITY SOLD : ' v_quantity_sold); 27 close cur_sql; 28 end loop; 29 close cur_products; 30 end; 19line 과 22 라인에서문자열을구성하는부분은전과유사하다. 다만변수를 Operator 를 통해결합시키지않고 :b1 라는부분을사용한것과 open cursor 명령에서 using 절을이용해 앞서선언한 :b1 부분에 rec_products.prod_id 라는변수를입력하는것이다르다. 이부분을

19 통해각각의경우입력받는값이 1 개또는 2 개라도각각의경우에맞는 Bind SQL 문을 사용할수있으며 Hard Parsing 에의한성능감소현상을거의없앨수있다. 대부분의경우위와같이처리하면큰문제없이수행이가능하지만 5 장에서살펴본바와 마찬가지로이경우에도 Soft Parse 과다현상및반복적인 Cursor 의 Open Close 에의한 부하는여전히존재한다는문제가있다. 따라서보다근원적인문제해결방식은 SQL 문의반복 수행자체를막는것이라고할수있다. 아래 Source 를보자. 01 declare 02 cursor cur_products(p_from_time in varchar2, p_to_time in varchar2) is 03 select 04 prd.prod_id 05,prd.prod_name 06,sum(sales.amount_sold) amount_sold 07,case 08 when prd.prod_list_price>100 then sum(sales.quantity_sold)*prd.prod_list_price 09 else end quantity_sold 12 from 13 sh.products prd 14,sh.sales sales 15 where 16 prd.prod_status = 'available, on stock' 17 and prod_category in ('Men','Women') 18 and sales.time_id(+) >= to_date(p_from_time,'yyyymmdd') 19 and sales.time_id(+) < to_date(p_to_time,'yyyymmdd') 20 and prd.prod_id = sales.prod_id(+) 21 group by 22 prd.prod_id 23,prd.prod_name 24,prd.prod_list_price; 25 rec_products cur_products%rowtype; 26 begin 27 open cur_products(' ',' '); 28 loop 29 fetch cur_products into rec_products; 30 exit when cur_products%notfound; dbms_output.put_line('amount SOLD : ' rec_products.amount_sold ', QUANTITY SOLD : ' rec_products.quantity_sold); 32 end loop; 33 close cur_products; 34 end; 반복적으로사용되던부분이 cur_products cursor 부분에흡수되었다. Group by 절이추가되고 prod_id, prod_name,prod_list_price 가추가되었다. SQL 문통합시반복수행되는 prod_id 만을 group by 에지정하면 prod_name, prod_list_price 는구할방법이없다. prod_name, prod_list_price 는 prod_id 에종속적이므로 group by 절에 prod_id 뿐만아니라 prod_name, prod_list_price 까지추가해원하는자료를가져올수있도록하였다.

20 SQL 통합시고려해야할또다른중요한점은 18~20 line 에나타나있다. 바로 Outer Join 의사용이그것이다. 원 source 를보면 cur_products cursor 의자료를통해반복수행되는 cur_sql 부분이호출됨을알수있으나 cur_sql 에서아무런자료도출력되지않을경우그것을사용하지않겠다는부분은나타나지않고있다. 만일 v_amount_sold 값이 0 보다크다 라거나또다른명시적조건이존재하지않는경우는 Child 관계에해당하는 cur_sql cursor 의결과값이없더라도 Parent 에해당하는 cur_products cursor 부분의자료는유효하다는것을인지해야한다. 다음의표는지난호에서사용된주요자원사용량을각각의경우로비교하고있다. Stat Latch (get) 구 분 Case 1 Case 2 Case 3 소요시간 execute count 5,078 5, recursive calls 29,075 29,793 8,484 parse count (total) 4,928 4, parse count (hard) 4, parse time cpu parse time elapsed opened cursors cumulative 4,887 4, CPU used by this session library cache 273, ,812 5,093 shared pool 301,141 13,094 3,098 row cache objects 696,675 3,105 2,591 본 Table 에나타난수치는시스템환경에따라절대값자체는어느정도변경될수있으나값의비율은어느정도유지되므로상대적인수치로이해하는것이더바람직하다. Case1 에서 Case2 로가면서 Literal SQL 문의감소로인해 Hard Parsing 횟수가감소하고그로인해 Parse Time CPU 가떨어졌으며그시간이소요시간에반영되었음을알수있으며 Latch 자원사용량도상당히많이감소했음을보여주고있다. Case2 에서 Case3 로의변화로인해 Soft Parse 횟수가많이감소되었고 Parsing 에소요된시간이약간감소했음을알수있는데 Soft Parse 는이미 Shared Pool 에있는정보를활용하기때문에부담이작다는것을알수있다. 하지만 SQL 문통합에따라수행횟수가상당히감소되었고, 부담이적기는하지만 Soft Parse 의감소그리고 Latch 자원의사용량감소는수행시간을더단축시켜주고있다. 프로그램설계구조로인해 Case3 을적용할수도있고그렇지못할수도있으나가능하면 Case3 과같은식으로프로그램을작성하는것이훨씬더효율적인것이라고알수있다. 6.2 자료구조차이에서발생하는 Literal SQL 본프로그램은 oe 스키마의 order_items table 의내용을신규로생성한 order_summary 라는 table 로자료를이동시키는사례이다. 각각의 Order 별로주문번호, 주문일,15 개까지의제품번호, 15 개까지의주문액수를 1 개 Record 에표시하고자한다.

21 ORDER_ID LINE_ ITEM_ID PRODUCT_ID UNIT_PRICE QUANTITY ORDER_ID 2410 ORDER_DATE PRD_ID PRD_ID PRD_AMT PRD_AMT Table, Column 과같은 Database Object 이름은 bind 처리가되지않으므로 (parse 단계가 bind 단계보다먼저수행되고, 그렇기때문에 parse 단계에서 bind 변수의내용을알수없기때문에 사용하는 Object 가무엇인지알수없기때문이다.) 개발자는다음과같이프로그램을 작성하였다. 01 declare 02 v_sql varchar2(200); 03 cursor cur_order_item is 04 select order_id,trim(to_char(line_item_id,'09')) line_item_id,product_id,unit_price*quantity amt 05 from oe.order_items; 06 begin 07 insert into oe.order_summary(order_id,order_date) select order_id,to_char(order_date,'yyyy.mm.dd') from oe.orders; 08 for rec_order_item in cur_order_item loop 09 if rec_order_item.line_item_id is NOT NULL then 10 v_sql:='update oe.order_summary set prd_id' rec_order_item.line_item_id '=' rec_order_item.product_id 11 ', prd_amt' rec_order_item.line_item_id '=' rec_order_item.amt 12 'where order_id=' rec_order_item.order_id; 13 execute immediate v_sql; 14 end if; 15 end loop; 16 end; order_summary table 에 order_id 와 order_date 를입력한후 order_items table 의내용을 loop 를수행하며 literal SQL 문을만들어수행하였다. prd_id, prd_amt 다음의 line_item_id 가 컬럼이름이 hard coding 되어있으므로이부분에대한 bind 처리가되지않으므로 line 10,11 에서 line_item_id 를추가시켜 literal SQL 로사용하고있음을알수있다. SQL 문은 cur_order_item 의건수만큼수행되므로 order_items table 의건수만큼수행된다는것을알수 있으며이들모두서로다른값을가지고수행되므로 order_items table 건수만큼 Hard Parsing 이발생할것이라는것을짐작할수있다. 각각 15 개인 prd_id, prd_amt 컬럼에대해서는 literal SQL 문의사용이불가피하지만입력되는 값자체는 bind 처리가가능하므로프로그램을다음과같이작성할수있다. 01 declare 02 v_sql varchar2(200);

22 03 cursor cur_order_item is 04 select order_id,trim(to_char(line_item_id,'09')) line_item_id,product_id,unit_price*quantity amt 05 from oe.order_items; 06 begin 07 insert into oe.order_summary(order_id,order_date) select order_id,to_char(order_date,'yyyy.mm.dd') from oe.orders; 08 for rec_order_item in cur_order_item loop 09 if rec_order_item.line_item_id is NOT NULL then 10 v_sql:='update oe.order_summary set prd_id' rec_order_item.line_item_id '=:b0' 11 ', prd_amt' rec_order_item.line_item_id '=:b1 where order_id=:b2'; 12 execute immediate v_sql using rec_order_item.product_id,rec_order_item.amt,rec_order_item.order_id; 13 end if; 14 end loop; 15 end; line 10 과 line11 에서 literal SQL 문을생성하는과정은전과동일하다. 하지만실제로입력되는 prd_id,prd_amt 는 bind 변수를사용했음을알수있다. 이렇게할경우어느정도 Literal SQL 문은감소하지만 prd_id,prd_amt 의개수인 15 번의 Hard Parsing 은피할길이없다. 이경우도다음과같이 SQL 문을통합해 1 개의 SQL 문으로수행하도록할수있다. 1 insert into oe.order_summary 2 select ord.order_id,to_char(order_date,'yyyy.mm.dd') 3,max(decode(line_item_id,1,product_id)), 4,max(decode(line_item_id,1,unit_price*quantity)),... 5 from oe.order_items ordi, oe.orders ord 6 where ord.order_id=ordi.order_id 7 group by ord.order_id,to_char(order_date,'yyyy.mm.dd'); PL/SQL Logic 이사라지고 insert 문장으로대치되었다 - line3 과 line4 에서는 line_item_id 숫자만 증가하며동일한구조로사용된다. 이렇게할경우 SQL 문은단 1 회만수행되며 Parsing 작업도단 1 회면충분하다 본 Test 결과에서는 shared pool truncate 에따른내부작업으로 인해 execute count, parse count 가더큰값으로표시되므로유의하기바란다. Stat Latch (get) 구 분 Case 1 Case 2 Case 3 소요시간 execute count recursive calls 3,539 3, parse count (total) parse count (hard) parse time cpu parse time elapsed opened cursors cumulative CPU used by this session library cache 19,174 23,225 1,090 shared pool 21,964 3, row cache objects 6,476 1,

23 Case2 는주어진구조에서 Bind SQL 을사용한형태이다. 앞서언급했듯이값에대한부분은 Bind SQL 을통해공유가가능하지만컬럼이름에대한부분은여전히컬럼이름의개수만큼 Literal SQL 문으로작성되어야하므로어느정도의 Hard Parsing 은피하지못하고있다. 하지만구조는그대로사용하면서일부만 Bind SQL 로사용한것은많은향상을일으키지는못하고있다. 물론더많은자료에대해수행할경우 Case1 과 Case2 의격차는좀더커질수있지만큰효과는없어보인다. Case3 는 PL/SQL 로작성된프로그램을 SQL 문으로변경하면서구조를변경한사례이다. 실행횟수, 구조를변경한 Case3 은 parse 횟수, latch 자원사용량등 Case1 은물론 Case2 와비교해서도상당한향상이있었음을알수있다. 6.3 정해지지않은개수의변수를사용해발생하는 Literal SQL 앞의두가지사례는모두 SQL 문을통합해상당한성능향상을이룩한사례를제시하였다. 하지만실무에서는프로그램의구조상 SQL 문의통합이불가능한경우가많이존재한다. 예를들어전사개발표준이각단위별로작성된작은모듈을호출해사용하도록한경우이거나패키지프로그램을이용해또다른업무구축을하고자할경우등이런제약사항이발생하는경우는주변에서많이찾아볼수있다. 본예제는기능별로프로그램이모듈화한경우이며각모듈간기능의통합을불가능한경우를다룬다. 본프로그램은다음과같은 2 개의모듈로구성되어있으며 Caller 모듈은처리대상을추출해 Processor 모듈로넘겨주고, Processor 모듈은 Caller 모듈에서넘겨준처리대상으로값을처리한후 Caller 모듈로결과를보낸다. Caller 모듈은넘겨받은결과값으로후속처리 여기서는화면출력 을하는구조를갖는다. Caller 처리될값의인자로 Processor 모듈을호출한후처리결과수신 1개이상의값 List 처리결과 Processor 호출한모듈로부터넘겨받은인자를이용해처리 Processor 모듈을개발한개발자는 Processor 모듈을호출하는모듈이얼마나많은값 List 를 넘겨줄지알수없으므로입력되는값 List 를문자열로구성한후 IN 을이용해처리하는 다음과같은방식을사용하였다. ( 편의상 1 개의 Package 로 Caller 와 Processor 모듈을 표현하였다.) 본예제는 Caller 모듈에서외부에서입력받은기간중회계적으로 1/4, 2/4 기에 있었던프로모션행사중 Internet 을통해수행됐으며직접판매점을대상으로한프로모션 행사의정보를구하고 Processor 모듈에서는 Caller 모듈에서구해진프로모션행사에대해 일자별로프로모션비용을구해 Caller 모듈로넘겨지는구조를갖는다. -- Package Spec 1 create or replace package sh.lit_case3 AUTHID CURRENT_USER as 2 TYPE typ_promo IS TABLE OF promotions.promo_id%type index by binary_integer; 3 4 procedure proc_caller(p_begin_date in varchar2, p_end_date in varchar2); 5 procedure proc_processor(p_promo_list in typ_promo, p_time in varchar2, p_day_name out varchar2, p_sum_promo out number); 6 end lit_case3;

24 -- Package Body 01 create or replace package body sh.lit_case3 as 02 procedure proc_caller(p_begin_date in varchar2, p_end_date in varchar2) is 03 cursor cur_times(i_begin_date varchar2,i_end_date varchar2) is 04 select to_char(time_id,'yyyymmdd') time_id 05 from sh.times 06 where fiscal_quarter_number in (1,2) 07 and time_id between to_date(i_begin_date,'yyyymmdd') and to_date(i_end_date,'yyyymmdd'); 08 cursor cur_sales(i_date varchar2) is 09 select distinct prom.promo_id 10 from 11 sh.channels chan 12,sh.sales sales 13,sh.promotions prom 14 where 15 chan.channel_id=sales.channel_id 16 and sales.promo_id=prom.promo_id 17 and time_id=to_date(i_date,'yyyymmdd') 18 and chan.channel_class = 'Direct' 19 and prom.promo_category = 'internet'; 20 rec_time cur_times%rowtype; 21 tab_promo_id typ_promo; 22 v_sum_promo number; 23 v_day_name varchar2(20); 24 begin 25 open cur_times(p_begin_date,p_end_date); 26 loop 27 fetch cur_times into rec_time; 28 exit when cur_times%notfound; 29 open cur_sales(rec_time.time_id); 30 v_sum_promo:=0; 31 fetch cur_sales bulk collect into tab_promo_id; 32 if cur_sales%rowcount>0 then 33 proc_processor(tab_promo_id,rec_time.time_id,v_day_name,v_sum_promo); dbms_output.put_line(rec_time.time_id '[' v_day_name '] : ' v_sum_promo); 35 end if; 36 close cur_sales; 37 end loop; 38 close cur_times; 39 end; procedure proc_processor(p_promo_list in typ_promo, p_time in varchar2, p_day_name out varchar2, p_sum_promo out number) is 42 v_param_list varchar2(1000); 43 v_sql varchar2(1000); 44 i pls_integer:=1; 45 begin 46 v_param_list:=''; 47 while p_promo_list.exists(i) loop 48 if v_param_list is null then 49 v_param_list:='(' to_char(p_promo_list(i)); 50 else 51 v_param_list:=v_param_list ',' to_char(p_promo_list(i)); 52 end if; 53 i:=i+1;

25 54 end loop; 55 v_param_list:= v_param_list ')'; 56 v_sql:=' 57 declare 58 p_time varchar2(100); 59 p_sum_promo number; 60 begin 61 :p_sum_promo:=0; 62 select max(tim.day_name),nvl(sum(promo_cost),0) into :p_day_name,:p_sum_promo 63 from sh.promotions prom, sh.times tim 64 where promo_id in ' v_param_list ' and to_date(''' p_time ''',''YYYYMMDD'') between promo_begin_date and promo_end_date and tim.time_id=to_date(''' p_time ''',''YYYYMMDD''); 65 exception 66 when others then 67 :p_sum_promo := -1; 68 end;'; 69 execute immediate v_sql using in out p_sum_promo,in out p_day_name; 70 end; 71 end lit_case3; proc_processor 모듈은 p_promo_list 를통해입력되는값의개수를알지못하므로 line 46~line55 까지입력되는값으로문자열을구성하고있다. 그리고이것을사용해 line64 에서와 같이 IN 연산자를이용해정해지지않은개수의인수값을처리하고있으며실제처리되는 부분에서는 declare begin exception end 의구조를취하고있다. 입력받은값 List 를 문자열로구성하였으므로 Literal SQL 로수행되며 Processor 모듈은수행하는 SQL 문이모두 Hard Parsing 을유발하므로이부분이많이호출될경우성능상의문제가발생할수있다. 위의구조를그대로사용할경우특별히문제를개선할수있는방법은없어보인다. Oracle Version 부터 Literal SQL 문이사용된경우라도내부적으로 Bind SQL 문으로변환해수행할 수있는방식을제공하며 cursor_sharing 이라는 Parameter 값을조정해수행할수있다. 1 차적으로생각할수있는방법은 Processor 모듈에서 cursor_sharing Parameter 값을조정해 프로그램의구조변경없이 Bind SQL 을사용하는방식을생각해볼수있다. 하지만 Processor 모듈의어느부분에 execute immediate alter session set cursor_sharing=force 를사용하더라도 Bind SQL 로변경되지않았다는것을알수있을것이다. Test 결과 PL/SQL 구문에서 cursor_sharing 은 PL/SQL 내부에 declare ~ begin ~ end 구조내부에존재하는 Literal SQL 문에 대해서는적용되지않으며 SQL 내부에 bind 변수가일부사용될경우도적용되지않는것으로 나타났다. 따라서프로그램구조를일부변경해다음과같이재작성해볼수있다. -- Package Spec 위와동일 -- Package Body 01 create or replace package body sh.lit_case3 as 02 procedure proc_caller(p_begin_date in varchar2, p_end_date in varchar2) is 03 cursor cur_times(i_begin_date varchar2,i_end_date varchar2) is 04 select to_char(time_id,'yyyymmdd') time_id 05 from sh.times 06 where fiscal_quarter_number in (1,2) 07 and time_id between to_date(i_begin_date,'yyyymmdd') and to_date(i_end_date,'yyyymmdd');

26 08 cursor cur_sales(i_date varchar2) is 09 select distinct prom.promo_id 10 from 11 sh.channels chan 12,sh.sales sales 13,sh.promotions prom 14 where 15 chan.channel_id=sales.channel_id 16 and sales.promo_id=prom.promo_id 17 and time_id=to_date(i_date,'yyyymmdd') 18 and chan.channel_class = 'Direct' 19 and prom.promo_category = 'internet'; 20 rec_time cur_times%rowtype; 21 tab_promo_id typ_promo; 22 v_sum_promo number; 23 v_day_name varchar2(20); 24 begin 25 open cur_times(p_begin_date,p_end_date); 26 loop 27 fetch cur_times into rec_time; 28 exit when cur_times%notfound; 29 open cur_sales(rec_time.time_id); 30 v_sum_promo:=0; 31 fetch cur_sales bulk collect into tab_promo_id; 32 if cur_sales%rowcount>0 then 33 proc_processor(tab_promo_id,rec_time.time_id,v_day_name,v_sum_promo); dbms_output.put_line(rec_time.time_id '[' v_day_name '] : ' v_sum_promo); 35 end if; 36 close cur_sales; 37 end loop; 38 close cur_times; 39 end; procedure proc_processor(p_promo_list in typ_promo, p_time in varchar2, p_day_name out varchar2, p_sum_promo out number) is 42 v_param_list varchar2(1000); 43 v_sql varchar2(1000); 44 i pls_integer:=1; 45 begin 46 v_param_list:=''; 47 while p_promo_list.exists(i) loop 48 if v_param_list is null then 49 v_param_list:='(' to_char(p_promo_list(i)); 50 else 51 v_param_list:=v_param_list ',' to_char(p_promo_list(i)); 52 end if; 53 i:=i+1; 54 end loop; 55 v_param_list:= v_param_list ')'; 56 execute immediate 'alter session set cursor_sharing=force'; 57 begin 58 v_sql:='select max(tim.day_name),nvl(sum(promo_cost),0) 59 from sh.promotions prom, sh.times tim 60 where promo_id in ' v_param_list ' and to_date(''' p_time ''',''YYYYMMDD'') between promo_begin_date and promo_end_date and tim.time_id=to_date(''' p_time ''',''YYYYMMDD'')'; 61 execute immediate v_sql into p_day_name,p_sum_promo;

27 62 exception 63 when others then 64 p_sum_promo := -1; 65 end; 66 execute immediate 'alter session set cursor_sharing=exact'; 67 end; 68 end lit_case3; 위와같이프로그램을작성하면다음 < 그림 2> 와같이사용된 Literal SQL 문이모두 Bind SQL 문으로변경되어수행됨을알수있다. 그림 2.. Shared Pool 을통해본 Literal SQL 과 Cursor_sharing 으로 Bind 처리된 SQL 이외에는대안이없을까? cursor_shaing 을사용하지않고다음과같이 Bind SQL 문을작성할 수도있다. -- Package Spec 위와동일 -- Package Body 01 create or replace package body sh.lit_case3 as 02 procedure proc_caller(p_begin_date in varchar2, p_end_date in varchar2) is 03 cursor cur_times(i_begin_date varchar2,i_end_date varchar2) is 04 select to_char(time_id,'yyyymmdd') time_id 05 from sh.times 06 where fiscal_quarter_number in (1,2) 07 and time_id between to_date(i_begin_date,'yyyymmdd') and to_date(i_end_date,'yyyymmdd'); 08 cursor cur_sales(i_date varchar2) is 09 select distinct prom.promo_id 10 from 11 sh.channels chan 12,sh.sales sales 13,sh.promotions prom 14 where 15 chan.channel_id=sales.channel_id 16 and sales.promo_id=prom.promo_id 17 and time_id=to_date(i_date,'yyyymmdd') 18 and chan.channel_class = 'Direct'

28 19 and prom.promo_category = 'internet'; 20 rec_time cur_times%rowtype; 21 tab_promo_id typ_promo; 22 v_sum_promo number; 23 v_day_name varchar2(20); 24 begin 25 open cur_times(p_begin_date,p_end_date); 26 loop 27 fetch cur_times into rec_time; 28 exit when cur_times%notfound; 29 open cur_sales(rec_time.time_id); 30 v_sum_promo:=0; 31 fetch cur_sales bulk collect into tab_promo_id; 32 if cur_sales%rowcount>0 then 33 proc_processor(tab_promo_id,rec_time.time_id,v_day_name,v_sum_promo); dbms_output.put_line(rec_time.time_id '[' v_day_name '] : ' v_sum_promo); 35 end if; 36 close cur_sales; 37 end loop; 38 close cur_times; 39 end; procedure proc_processor(p_promo_list in typ_promo, p_time in varchar2, p_day_name out varchar2, p_sum_promo out number) is 42 v_sql varchar2(1000); 43 v_day_name varchar2(100); 44 v_sum_promo number; i pls_integer:=1; 47 j pls_integer; 48 cur_sql_exec number; 49 ignore number; 50 begin 51 cur_sql_exec:=dbms_sql.open_cursor; 52 v_sql:='select max(tim.day_name),nvl(sum(promo_cost),0) 53 from sh.promotions prom, sh.times tim 54 where to_date(:p_time,''yyyymmdd'') between promo_begin_date and promo_end_date and tim.time_id=to_date(:p_time,''yyyymmdd'') and promo_id in ('; 55 while p_promo_list.exists(i) loop 56 v_sql:=v_sql ':b' i ','; 57 i:=i+1; 58 end loop; 59 v_sql:=substr(v_sql,1,lengthb(v_sql)-1) ')'; 60 dbms_sql.parse(cur_sql_exec,v_sql,1); 61 begin 62 dbms_sql.define_column(cur_sql_exec,1,p_day_name,100); 63 dbms_sql.define_column(cur_sql_exec,2,p_sum_promo); 64 dbms_sql.bind_variable(cur_sql_exec,'p_time',p_time); 65 i:=1; 66 while p_promo_list.exists(i) loop 67 dbms_sql.bind_variable(cur_sql_exec,'b' i,p_promo_list(i)); 68 i:=i+1; 69 end loop; 70 ignore:=sys.dbms_sql.execute_and_fetch(cur_sql_exec); 71 dbms_sql.column_value(cur_sql_exec,1,p_day_name); 72 dbms_sql.column_value(cur_sql_exec,2,p_sum_promo); 73 if ignore=0 then

29 74 p_sum_promo:=0; 75 end if; 76 exception 77 when others then 78 p_sum_promo := -1; 79 end; 80 dbms_sql.close_cursor(cur_sql_exec); 81 exception 82 when others then 83 if dbms_sql.is_open(cur_sql_exec) then 84 dbms_sql.close_cursor(cur_sql_exec); 85 end if; 86 end; 87 end lit_case3; Processor 로입력되는 p_promo_list 변수를이용해동적으로 Bind SQL 문을구성하는것이다. 이런방식을사용하면 cursor_sharing 사용에따르는내부적으로수행되는 Literal Check 부분을 수행하지않으므로유리하지만 dbms_sql Package 를과다하게호출하는부담도발생하므로 어느것이유리하다고잘라말하기는어려울듯하다. 두번째와세번째방법을이용하면분명히 Bind SQL 문이사용되지만 IN List 에들어오는변수의 개수가서로틀리기때문에그효율이떨어진다고할수있다. 위에첨부된 < 그림 2> 에서도 알수있듯이 2,4,6 번수행된 SQL 문도존재하므로효율이좋다고할수는없다. 이문제를 해결하기위해가장 IN List 에들어가는변수중가장많이들어가는변수를구해서모든 SQL 문의 IN List 를그개수로구성하는방법을떠올릴수있다. -- Global 변수를저장하는 Package 1 create or replace package sh.global_variable AUTHID CURRENT_USER as 2 g_maxcnt number:=15; 3 end global_variable; -- Package Spec 위와동일 -- Package Body 01 create or replace package body sh.lit_case3 as 02 procedure proc_caller(p_begin_date in varchar2, p_end_date in varchar2) is 03 cursor cur_times(i_begin_date varchar2,i_end_date varchar2) is 04 select to_char(time_id,'yyyymmdd') time_id 05 from sh.times 06 where fiscal_quarter_number in (1,2) 07 and time_id between to_date(i_begin_date,'yyyymmdd') and to_date(i_end_date,'yyyymmdd'); 08 cursor cur_sales(i_date varchar2) is 09 select distinct prom.promo_id 10 from 11 sh.channels chan 12,sh.sales sales 13,sh.promotions prom 14 where 15 chan.channel_id=sales.channel_id 16 and sales.promo_id=prom.promo_id 17 and time_id=to_date(i_date,'yyyymmdd') 18 and chan.channel_class = 'Direct' 19 and prom.promo_category = 'internet';

30 20 rec_time cur_times%rowtype; 21 tab_promo_id typ_promo; 22 v_sum_promo number; 23 v_day_name varchar2(20); 24 begin 25 open cur_times(p_begin_date,p_end_date); 26 loop 27 fetch cur_times into rec_time; 28 exit when cur_times%notfound; 29 open cur_sales(rec_time.time_id); 30 v_sum_promo:=0; 31 fetch cur_sales bulk collect into tab_promo_id; 32 if cur_sales%rowcount>0 then 33 proc_processor(tab_promo_id,rec_time.time_id,v_day_name,v_sum_promo); dbms_output.put_line(rec_time.time_id '[' v_day_name '] : ' v_sum_promo); 35 end if; 36 close cur_sales; 37 end loop; 38 close cur_times; 39 end; procedure proc_processor(p_promo_list in typ_promo, p_time in varchar2, p_day_name out varchar2, p_sum_promo out number) is 42 v_sql varchar2(1000); 43 v_day_name varchar2(100); 44 v_sum_promo number; i pls_integer:=1; 47 j pls_integer; 48 cur_sql_exec number; 49 ignore number; 50 begin 51 cur_sql_exec:=dbms_sql.open_cursor; 52 v_sql:='select max(tim.day_name),nvl(sum(promo_cost),0) 53 from sh.promotions prom, sh.times tim 54 where to_date(:p_time,''yyyymmdd'') between promo_begin_date and promo_end_date and tim.time_id=to_date(:p_time,''yyyymmdd'') and promo_id in ('; 55 for i in 1..sh.global_variable.g_maxcnt loop 56 if i=sh.global_variable.g_maxcnt then 57 v_sql:=v_sql ':b' i ')' ; 58 else 59 v_sql:=v_sql ':b' i ',' ; 60 end if; 61 end loop; 62 dbms_sql.parse(cur_sql_exec,v_sql,1); 63 begin 64 dbms_sql.define_column(cur_sql_exec,1,p_day_name,100); 65 dbms_sql.define_column(cur_sql_exec,2,p_sum_promo); 66 dbms_sql.bind_variable(cur_sql_exec,'p_time',p_time); 67 while p_promo_list.exists(i) loop 68 dbms_sql.bind_variable(cur_sql_exec,'b' i,p_promo_list(i)); 69 i:=i+1; 70 end loop; 71 j:=i; 72 while j<=sh.global_variable.g_maxcnt loop 73 dbms_sql.bind_variable(cur_sql_exec,'b' j,-1); 74 j:=j+1;

31 75 end loop; 76 ignore:=sys.dbms_sql.execute(cur_sql_exec); 77 ignore:=sys.dbms_sql.fetch_rows(cur_sql_exec); 78 dbms_sql.column_value(cur_sql_exec,1,p_day_name); 79 dbms_sql.column_value(cur_sql_exec,2,p_sum_promo); 80 if ignore=0 then 81 p_sum_promo:=0; 82 end if; 83 exception 84 when others then 85 p_sum_promo := -1; 86 end; 87 dbms_sql.close_cursor(cur_sql_exec); 88 exception 89 when others then 90 if dbms_sql.is_open(cur_sql_exec) then 91 dbms_sql.close_cursor(cur_sql_exec); 92 end if; 93 end; 94 end lit_case3; 이방법은 SQL 문의공유를극대화했다는점에서는장점을갖지만 IN List 를통해입력되는 변수의최대개수를구하는부분이또다른성능의병목이될수있다는점을무시할수없다. 또최개개수만큼 Dummy 로 Bind 값을구성해주어야하므로많이사용되는경우이부분 또한무시할수없는부분이될수있다. 여기서는최대개수가미리정해진것으로가정하고 사용했으나실무에서는미리지정된값을사용하기가어려울수있다. 또최대개수를절대 발생하지않을만큼넉넉하게지정하면앞서언급한대로 Processor 모듈에서 SQL 문구성에 따른부담으로나타나오히려시간이더많이소요될수있으므로이또한바람직하지않다. Stat Latch (get) 구 분 Case 1 Case 2 Case 3 Case 4 소요시간 execute count 1,227 1, recursive calls 8,564 8,648 7,808 9,055 parse count (total) parse count (hard) parse time cpu parse time elapsed opened cursors cumulative CPU used by this session library cache 28,724 16,516 33,371 47,519 shared pool 28,972 5,189 6,900 6,631 row cache objects 20,232 4,076 4,436 2,870 수행시간은 Case1 을제외하고는모두큰차이없는것으로보인다. 다만 Case4 는 IN List 에사용되는최대변수의개수가이미정해져있다는가정하에작성되었으며동적으로이값을구하는경우는많은부분을검색해결과를가져와야하므로최소 5 초정도의 Overhead 가더발생한다는문제가있기때문에이와같은환경에서는 Case4 는고려대상이될수없다. 여러가지지표를통해볼때 Case2 보다는 Case3 이더바람직해보이지만둘사이에큰차이가있지는않으므로개발자가사용하기편한방법을사용해도좋을듯하다. 하지만 IN List 를

32 통해넘어오는값의개수가많지않으며대부분동일한개수의값이사용된다면 Case3 이좀 더유리할것으로보인다.

33 7. 결론 Parsing 이라는작업이무엇인지알아보았고 Hard Parsing 이라는것이얼마나성능에좋지못한영향을미치는지알아보았다. 또몇가지형태별로동일한작업을수행했을때오라클내부적으로어떤자원들이얼마나사용되는지알아보았다. SQL 문작성시 Hard Parsing 을피하면서보다더좋은성능으로작동될수있는몇가지방법을알아보았다. 본문서를처음작성할때는 Literal SQL 의제거를통한성능향상기법까지만알아보려했으나 SQL 사용시그것보다더중요하다고생각되는것이바로 SQL 적인표현기법이기때문에 SQL 통합을통한성능개선까지알아보았다. 본문서에언급되어있는방법외에도여러가지방법으로 Test 를수행해보면더다양한경험을할수있을것으로생각된다. 이문서의내용이많은분들에게도움이됐으면하는바람이다.

34 8. Reference 1. Oracle9i Database Performance Tuning Guide and Reference Release 2 (9.2) 2. Oracle9i Database Concepts Release 2 (9.2) 3. Oracle9i Supplied PL/SQL Packages and Types Reference 2 (9.2) 4. Oracle9i Reference Release 2 (9.2) 5. Metalink NOTE : SQL Parsing Flow Diagram 6. Metalink NOTE : Understanding and Tuning the Shared Pool 7. : Efficient use of bind variables, cursor_sharing and related cursor parameters(bjørn Engsig) 8. : A LOOK UNDER THE HOOD OF CBO: THE EVENT(Wolfgang Breitling)

歯sql_tuning2

歯sql_tuning2 SQL Tuning (2) SQL SQL SQL Tuning ROW(1) ROW(2) ROW(n) update ROW(2) at time 1 & Uncommitted update ROW(2) at time 2 SQLDBA> @ UTLLOCKT WAITING_SESSION TYPE MODE_REQUESTED MODE_HELD LOCK_ID1

More information

Bind Peeking 한계에따른 Adaptive Cursor Sharing 등장 엑셈컨설팅본부 /DB 컨설팅팀김철환 Bind Peeking 의한계 SQL 이최초실행되면 3 단계의과정을거치게되는데 Parsing 단계를거쳐 Execute 하고 Fetch 의과정을통해데이터

Bind Peeking 한계에따른 Adaptive Cursor Sharing 등장 엑셈컨설팅본부 /DB 컨설팅팀김철환 Bind Peeking 의한계 SQL 이최초실행되면 3 단계의과정을거치게되는데 Parsing 단계를거쳐 Execute 하고 Fetch 의과정을통해데이터 Bind Peeking 한계에따른 Adaptive Cursor Sharing 등장 엑셈컨설팅본부 /DB 컨설팅팀김철환 Bind Peeking 의한계 SQL 이최초실행되면 3 단계의과정을거치게되는데 Parsing 단계를거쳐 Execute 하고 Fetch 의과정을통해데이터를사용자에게전송하게되며 Parsing 단계에서실행계획이생성된다. Bind 변수를사용하는 SQL

More information

목차 BUG 문법에맞지않는질의문수행시, 에러메시지에질의문의일부만보여주는문제를수정합니다... 3 BUG ROUND, TRUNC 함수에서 DATE 포맷 IW 를추가지원합니다... 5 BUG ROLLUP/CUBE 절을포함하는질의는 SUBQUE

목차 BUG 문법에맞지않는질의문수행시, 에러메시지에질의문의일부만보여주는문제를수정합니다... 3 BUG ROUND, TRUNC 함수에서 DATE 포맷 IW 를추가지원합니다... 5 BUG ROLLUP/CUBE 절을포함하는질의는 SUBQUE ALTIBASE HDB 6.3.1.10.1 Patch Notes 목차 BUG-45710 문법에맞지않는질의문수행시, 에러메시지에질의문의일부만보여주는문제를수정합니다... 3 BUG-45730 ROUND, TRUNC 함수에서 DATE 포맷 IW 를추가지원합니다... 5 BUG-45760 ROLLUP/CUBE 절을포함하는질의는 SUBQUERY REMOVAL 변환을수행하지않도록수정합니다....

More information

Result Cache 동작원리및활용방안 엑셈컨설팅본부 /DB 컨설팅팀김철환 개요 ORACLE DBMS 를사용하는시스템에서 QUERY 성능은무엇보다중요한요소중하나이며그 성능과직접적인관련이있는것이 I/O 이다. 많은건수를 ACCESS 해야만원하는결과값을얻을수있는 QUER

Result Cache 동작원리및활용방안 엑셈컨설팅본부 /DB 컨설팅팀김철환 개요 ORACLE DBMS 를사용하는시스템에서 QUERY 성능은무엇보다중요한요소중하나이며그 성능과직접적인관련이있는것이 I/O 이다. 많은건수를 ACCESS 해야만원하는결과값을얻을수있는 QUER Result Cache 동작원리및활용방안 엑셈컨설팅본부 /DB 컨설팅팀김철환 개요 ORACLE DBMS 를사용하는시스템에서 QUERY 성능은무엇보다중요한요소중하나이며그 성능과직접적인관련이있는것이 I/O 이다. 많은건수를 ACCESS 해야만원하는결과값을얻을수있는 QUERY 을실행하게된다면 BLOCK I/O 가많이발생하게된다. 이런이유로 QUERY 의성능은좋지못할것이다.

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 Reasons for Poor Performance Programs 60% Design 20% System 2.5% Database 17.5% Source: ORACLE Performance Tuning 1 SMS TOOL DBA Monitoring TOOL Administration TOOL Performance Insight Backup SQL TUNING

More information

90

90 89 3 차원공간질의를위한효율적인위상학적데이터모델의검증 Validation of Efficient Topological Data Model for 3D Spatial Queries Seokho Lee Jiyeong Lee 요약 키워드 Abstract Keywords 90 91 92 93 94 95 96 -- 3D Brep adjacency_ordering DECLARE

More information

목차 BUG offline replicator 에서유효하지않은로그를읽을경우비정상종료할수있다... 3 BUG 각 partition 이서로다른 tablespace 를가지고, column type 이 CLOB 이며, 해당 table 을 truncate

목차 BUG offline replicator 에서유효하지않은로그를읽을경우비정상종료할수있다... 3 BUG 각 partition 이서로다른 tablespace 를가지고, column type 이 CLOB 이며, 해당 table 을 truncate ALTIBASE HDB 6.1.1.5.6 Patch Notes 목차 BUG-39240 offline replicator 에서유효하지않은로그를읽을경우비정상종료할수있다... 3 BUG-41443 각 partition 이서로다른 tablespace 를가지고, column type 이 CLOB 이며, 해당 table 을 truncate 한뒤, hash partition

More information

목차 BUG DEQUEUE 의 WAIT TIME 이 1 초미만인경우, 설정한시간만큼대기하지않는문제가있습니다... 3 BUG [qp-select-pvo] group by 표현식에있는컬럼을참조하는집합연산이존재하지않으면결괏값오류가발생할수있습니다... 4

목차 BUG DEQUEUE 의 WAIT TIME 이 1 초미만인경우, 설정한시간만큼대기하지않는문제가있습니다... 3 BUG [qp-select-pvo] group by 표현식에있는컬럼을참조하는집합연산이존재하지않으면결괏값오류가발생할수있습니다... 4 ALTIBASE HDB 6.5.1.5.10 Patch Notes 목차 BUG-46183 DEQUEUE 의 WAIT TIME 이 1 초미만인경우, 설정한시간만큼대기하지않는문제가있습니다... 3 BUG-46249 [qp-select-pvo] group by 표현식에있는컬럼을참조하는집합연산이존재하지않으면결괏값오류가발생할수있습니다... 4 BUG-46266 [sm]

More information

MS-SQL SERVER 대비 기능

MS-SQL SERVER 대비 기능 Business! ORACLE MS - SQL ORACLE MS - SQL Clustering A-Z A-F G-L M-R S-Z T-Z Microsoft EE : Works for benchmarks only CREATE VIEW Customers AS SELECT * FROM Server1.TableOwner.Customers_33 UNION ALL SELECT

More information

원장 차세대 필요성 검토

원장 차세대 필요성 검토 1. Application Architecture Layered Application 개념 Layered Application 개념도 구분 Presentation Layer Business Layer Data Layer Data Sources 내용설명 Business Layer 와 User 간 Interface 제공 Business Logic 구현 Data

More information

13주-14주proc.PDF

13주-14주proc.PDF 12 : Pro*C/C++ 1 2 Embeded SQL 3 PRO *C 31 C/C++ PRO *C NOT! NOT AND && AND OR OR EQUAL == = SQL,,, Embeded SQL SQL 32 Pro*C C SQL Pro*C C, C Pro*C, C C 321, C char : char[n] : n int, short, long : float

More information

배치프로그램에서튜닝대상 SQL 추출하기 엑셈컨설팅본부 /DB 컨설팅팀박성호 배치프로그램의성능문제를진단하기위해트레이스를사용할수없고, 개별 SQL 에대한성 능점검은비효율적인경우에어떻게배치프로그램의성능문제를제대로파악하고개선안을도 출할것인가? 복잡한로직을가지고있는프로그램 (

배치프로그램에서튜닝대상 SQL 추출하기 엑셈컨설팅본부 /DB 컨설팅팀박성호 배치프로그램의성능문제를진단하기위해트레이스를사용할수없고, 개별 SQL 에대한성 능점검은비효율적인경우에어떻게배치프로그램의성능문제를제대로파악하고개선안을도 출할것인가? 복잡한로직을가지고있는프로그램 ( 배치프로그램에서튜닝대상 SQL 추출하기 엑셈컨설팅본부 /DB 컨설팅팀박성호 배치프로그램의성능문제를진단하기위해트레이스를사용할수없고, 개별 SQL 에대한성 능점검은비효율적인경우에어떻게배치프로그램의성능문제를제대로파악하고개선안을도 출할것인가? 복잡한로직을가지고있는프로그램 ( 이후배치프로그램 ) 에대한성능문제를파악하기위해수행되는모든 SQL 에대한개별수행내역을정확히판단할수있어야한다.

More information

대량의 DML 작업에대한성능개선방안 엑셈컨설팅본부 /DB 컨설팅팀박준연 개요 대량의데이터를변경해야하는작업은그자체만으로도큰부담으로다가온다. 하지만변경작업자체에만국한되는것이아니라변경되기전데이터와변경이후데이터를각각저장관리해야하는메커니즘이라면성능을개선해야하는입장에서는더욱큰부담

대량의 DML 작업에대한성능개선방안 엑셈컨설팅본부 /DB 컨설팅팀박준연 개요 대량의데이터를변경해야하는작업은그자체만으로도큰부담으로다가온다. 하지만변경작업자체에만국한되는것이아니라변경되기전데이터와변경이후데이터를각각저장관리해야하는메커니즘이라면성능을개선해야하는입장에서는더욱큰부담 대량의 DML 작업에대한성능개선방안 엑셈컨설팅본부 /DB 컨설팅팀박준연 개요 대량의데이터를변경해야하는작업은그자체만으로도큰부담으로다가온다. 하지만변경작업자체에만국한되는것이아니라변경되기전데이터와변경이후데이터를각각저장관리해야하는메커니즘이라면성능을개선해야하는입장에서는더욱큰부담일것이다. 말그대로대량의데이터를변경해야하는작업의특성상 SQL Tuning 만으로성능을개선할여지는많지않을뿐더러개선을한다하더라도극적인효과를기대하기는어렵다.

More information

Oracle Database 10g: Self-Managing Database DB TSC

Oracle Database 10g: Self-Managing Database DB TSC Oracle Database 10g: Self-Managing Database DB TSC Agenda Overview System Resource Application & SQL Storage Space Backup & Recovery ½ Cost ? 6% 12 % 6% 6% 55% : IOUG 2001 DBA Survey ? 6% & 12 % 6% 6%

More information

The Self-Managing Database : Automatic Health Monitoring and Alerting

The Self-Managing Database : Automatic Health Monitoring and Alerting The Self-Managing Database : Automatic Health Monitoring and Alerting Agenda Oracle 10g Enterpirse Manager Oracle 10g 3 rd Party PL/SQL API Summary (Self-Managing Database) ? 6% 6% 12% 55% 6% Source: IOUG

More information

WINDOW FUNCTION 의이해와활용방법 엑셈컨설팅본부 / DB 컨설팅팀정동기 개요 Window Function 이란행과행간의관계를쉽게정의할수있도록만든함수이다. 윈도우함수를활용하면복잡한 SQL 들을하나의 SQL 문장으로변경할수있으며반복적으로 ACCESS 하는비효율역

WINDOW FUNCTION 의이해와활용방법 엑셈컨설팅본부 / DB 컨설팅팀정동기 개요 Window Function 이란행과행간의관계를쉽게정의할수있도록만든함수이다. 윈도우함수를활용하면복잡한 SQL 들을하나의 SQL 문장으로변경할수있으며반복적으로 ACCESS 하는비효율역 WINDOW FUNCTION 의이해와활용방법 엑셈컨설팅본부 / DB 컨설팅팀정동기 개요 Window Function 이란행과행간의관계를쉽게정의할수있도록만든함수이다. 윈도우함수를활용하면복잡한 SQL 들을하나의 SQL 문장으로변경할수있으며반복적으로 ACCESS 하는비효율역시쉽게해결할수있다. 이번화이트페이퍼에서는 Window Function 중순위 RANK, ROW_NUMBER,

More information

ORANGE FOR ORACLE V4.0 INSTALLATION GUIDE (Online Upgrade) ORANGE CONFIGURATION ADMIN O

ORANGE FOR ORACLE V4.0 INSTALLATION GUIDE (Online Upgrade) ORANGE CONFIGURATION ADMIN O Orange for ORACLE V4.0 Installation Guide ORANGE FOR ORACLE V4.0 INSTALLATION GUIDE...1 1....2 1.1...2 1.2...2 1.2.1...2 1.2.2 (Online Upgrade)...11 1.3 ORANGE CONFIGURATION ADMIN...12 1.3.1 Orange Configuration

More information

Commit_Wait / Commit_Logging 두파라미터를통해 Log File Sync 대기시간을감소시킬수있다는것은놀라움과의아함을동시에느낄수있다. 단지파라미터의수정을통해당연히대기해야하는시간을감축한다는것은분명성능을개선해야하는입장에서는놀라운일이될것이다. 반면, 그에따

Commit_Wait / Commit_Logging 두파라미터를통해 Log File Sync 대기시간을감소시킬수있다는것은놀라움과의아함을동시에느낄수있다. 단지파라미터의수정을통해당연히대기해야하는시간을감축한다는것은분명성능을개선해야하는입장에서는놀라운일이될것이다. 반면, 그에따 Commit Wait Class 대기시간감소방안 엑셈컨설팅본부 /DB 컨설팅팀박준연 개요 Wait Class 중 Commit 카테고리에해당하는 Wait Event 에의한대기현상으로 DB 시스템의성능저하현상이발생하는것은종종경험할수있다. 그중대표적인 Wait Event 는 Log File Sync 이다. 실제로대부분의 DB 시스템의 Top 5 Wait Event

More information

Jerry Held

Jerry Held DB / TSC Oracle Database 10g (Self-Managing Database) (Common Infrastructure) (Automatic Workload Repository) (Server-generated Alerts) (Automated Maintenance Tasks) (Advisory Framework) (ADDM) (Self-Managing

More information

最即時的Sybase ASE Server資料庫診斷工具

最即時的Sybase ASE Server資料庫診斷工具 TOAD 9.5 Toad Oracle 料 SQL 料 行 理 SQLprofile Quest Software 了 Oracle -Toad Tools of Oracle Application Developers Toad 了 DBA DBA 理 易 度 Toad 料 SQL PL/SQL Toad Oracle PL/SQL Toad Schema Browser Schema Browser

More information

DBMS & SQL Server Installation Database Laboratory

DBMS & SQL Server Installation Database Laboratory DBMS & 조교 _ 최윤영 } 데이터베이스연구실 (1314 호 ) } 문의사항은 cyy@hallym.ac.kr } 과제제출은 dbcyy1@gmail.com } 수업공지사항및자료는모두홈페이지에서확인 } dblab.hallym.ac.kr } 홈페이지 ID: 학번 } 홈페이지 PW:s123 2 차례 } } 설치전점검사항 } 설치단계별설명 3 Hallym Univ.

More information

SQL Tuning Business Development DB

SQL Tuning Business Development DB SQL Tuning Business Development DB Oracle Optimizer 4.1 Optimizer SQL SQL.. SQL Optimizer :.. Rule-Based Optimization (RBO), Cost-Based Optimization (CBO) SQL Optimizer SQL Query Parser Dictionary Rule-Based

More information

C# Programming Guide - Types

C# Programming Guide - Types C# Programming Guide - Types 최도경 lifeisforu@wemade.com 이문서는 MSDN 의 Types 를요약하고보충한것입니다. http://msdn.microsoft.com/enus/library/ms173104(v=vs.100).aspx Types, Variables, and Values C# 은 type 에민감한언어이다. 모든

More information

목 차

목      차 Oracle 9i Admim 1. Oracle RDBMS 1.1 (System Global Area:SGA) 1.1.1 (Shared Pool) 1.1.2 (Database Buffer Cache) 1.1.3 (Redo Log Buffer) 1.1.4 Java Pool Large Pool 1.2 Program Global Area (PGA) 1.3 Oracle

More information

MaxGauge( 맥스게이지 ) 를이용한 SQL 모니터링, 진단 / 분석및튜닝가이드 엑셈

MaxGauge( 맥스게이지 ) 를이용한 SQL 모니터링, 진단 / 분석및튜닝가이드 엑셈 MaxGauge( 맥스게이지 ) 를이용한 SQL 모니터링, 진단 / 분석및튜닝가이드 엑셈 I. MAXGAUGE 소개및기대효과 II. 개발단계에서의튜닝프로세스확립 III. 테스트 ( 단위 / 부하 ) 단계에서의악성 SQL 검출및진단방안 Ⅳ. 운영단계에서의 Top-SQL 검출및진단방안 Ⅰ. Maxgauge 소개및기대효과맥스게이지란? MaxGauge( 맥스게이지

More information

,, - - - : DELETE : ROW (ROWID) row ROWID : I/O Full Table Scan scan I/O scan Index Scan ROWID scan I/O Fast Full Index Scan scan scan I/O Unique, nonunique. (Concatenated Index) B* Tree Bitmap Reverse

More information

Jerry Held

Jerry Held ,, - - - : DELETE : ROW (ROWID) row ROWID : I/O Full Table Scan I/O Index Scan ROWID I/O Fast Full Index Scan scan scan scan I/O scan scan Unique, nonunique. (Concatenated Index) B* Tree Bitmap Reverse

More information

USER GUIDE

USER GUIDE Solution Package Volume II DATABASE MIGRATION 2010. 1. 9. U.Tu System 1 U.Tu System SeeMAGMA SYSTEM 차 례 1. INPUT & OUTPUT DATABASE LAYOUT...2 2. IPO 중 VB DATA DEFINE 자동작성...4 3. DATABASE UNLOAD...6 4.

More information

ETL_project_best_practice1.ppt

ETL_project_best_practice1.ppt ETL ETL Data,., Data Warehouse DataData Warehouse ETL tool/system: ETL, ETL Process Data Warehouse Platform Database, Access Method Data Source Data Operational Data Near Real-Time Data Modeling Refresh/Replication

More information

슬라이드 1

슬라이드 1 Pairwise Tool & Pairwise Test NuSRS 200511305 김성규 200511306 김성훈 200614164 김효석 200611124 유성배 200518036 곡진화 2 PICT Pairwise Tool - PICT Microsoft 의 Command-line 기반의 Free Software www.pairwise.org 에서다운로드후설치

More information

ALTIBASE HDB Patch Notes

ALTIBASE HDB Patch Notes ALTIBASE HDB 6.5.1.5.6 Patch Notes 목차 BUG-45643 암호화컬럼의경우, 이중화환경에서 DDL 수행시 Replication HandShake 가실패하는문제가있어수정하였습니다... 4 BUG-45652 이중화에서 Active Server 와 Standby Server 의 List Partition 테이블의범위조건이다른경우에 Handshake

More information

MySQL-.. 1

MySQL-.. 1 MySQL- 기초 1 Jinseog Kim Dongguk University jinseog.kim@gmail.com 2017-08-25 Jinseog Kim Dongguk University jinseog.kim@gmail.com MySQL-기초 1 2017-08-25 1 / 18 SQL의 기초 SQL은 아래의 용도로 구성됨 데이터정의 언어(Data definition

More information

歯PLSQL10.PDF

歯PLSQL10.PDF 10 - SQL*Pl u s Pl / SQL - SQL*P lus 10-1 1 0.1 PL/ SQL SQL*Pl u s. SQL*P lus 10-2 1 0.2 S QL* Pl u s PL/ S QL SQL*Pl u s, Pl / SQL. - PL/ SQL (i npu t ), (s t or e ), (r un). - PL/ SQL s cr i pt,,. -

More information

비트와바이트 비트와바이트 비트 (Bit) : 2진수값하나 (0 또는 1) 를저장할수있는최소메모리공간 1비트 2비트 3비트... n비트 2^1 = 2개 2^2 = 4개 2^3 = 8개... 2^n 개 1 바이트는 8 비트 2 2

비트와바이트 비트와바이트 비트 (Bit) : 2진수값하나 (0 또는 1) 를저장할수있는최소메모리공간 1비트 2비트 3비트... n비트 2^1 = 2개 2^2 = 4개 2^3 = 8개... 2^n 개 1 바이트는 8 비트 2 2 비트연산자 1 1 비트와바이트 비트와바이트 비트 (Bit) : 2진수값하나 (0 또는 1) 를저장할수있는최소메모리공간 1비트 2비트 3비트... n비트 2^1 = 2개 2^2 = 4개 2^3 = 8개... 2^n 개 1 바이트는 8 비트 2 2 진수법! 2, 10, 16, 8! 2 : 0~1 ( )! 10 : 0~9 ( )! 16 : 0~9, 9 a, b,

More information

62

62 2 instance database physical storage 2 1 62 63 tablespace datafiles 2 2 64 1 2 logical view control files datafiles redo log files 65 2 3 9i OMF Oracle Managed Files, OMF 9i 9i / / OMF 9i 66 8 1MB 8 10MB

More information

Frama-C/JESSIS 사용법 소개

Frama-C/JESSIS 사용법 소개 Frama-C 프로그램검증시스템소개 박종현 @ POSTECH PL Frama-C? C 프로그램대상정적분석도구 플러그인구조 JESSIE Wp Aorai Frama-C 커널 2 ROSAEC 2011 동계워크샵 @ 통영 JESSIE? Frama-C 연역검증플러그인 프로그램분석 검증조건추출 증명 Hoare 논리에기초한프로그램검증도구 사용법 $ frama-c jessie

More information

A Hierarchical Approach to Interactive Motion Editing for Human-like Figures

A Hierarchical Approach to Interactive Motion Editing for Human-like Figures 단일연결리스트 (Singly Linked List) 신찬수 연결리스트 (linked list)? tail 서울부산수원용인 null item next 구조체복습 struct name_card { char name[20]; int date; } struct name_card a; // 구조체변수 a 선언 a.name 또는 a.date // 구조체 a의멤버접근 struct

More information

PowerPoint Presentation

PowerPoint Presentation Server I/O utilization System I/O utilization V$FILESTAT V$DATAFILE Data files Statspack Performance tools TABLESPACE FILE_NAME PHYRDS PHYBLKRD READTIM PHYWRTS PHYBLKWRT WRITETIM ------------- -----------------------

More information

untitled

untitled (shared) (integrated) (stored) (operational) (data) : (DBMS) :, (database) :DBMS File & Database - : - : ( : ) - : - : - :, - DB - - -DBMScatalog meta-data -DBMS -DBMS - -DBMS concurrency control E-R,

More information

PowerPoint Presentation

PowerPoint Presentation FORENSIC INSIGHT; DIGITAL FORENSICS COMMUNITY IN KOREA SQL Server Forensic AhnLab A-FIRST Rea10ne unused6@gmail.com Choi Jinwon Contents 1. SQL Server Forensic 2. SQL Server Artifacts 3. Database Files

More information

임베디드시스템설계강의자료 6 system call 2/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과

임베디드시스템설계강의자료 6 system call 2/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과 임베디드시스템설계강의자료 6 system call 2/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과 System call table and linkage v Ref. http://www.ibm.com/developerworks/linux/library/l-system-calls/ - 2 - Young-Jin Kim SYSCALL_DEFINE 함수

More information

BY-FDP-4-70.hwp

BY-FDP-4-70.hwp RS-232, RS485 FND Display Module BY-FDP-4-70-XX (Rev 1.0) - 1 - 1. 개요. 본 Display Module은 RS-232, RS-485 겸용입니다. Power : DC24V, DC12V( 주문사양). Max Current : 0.6A 숫자크기 : 58mm(FND Size : 70x47mm 4 개) RS-232,

More information

PCServerMgmt7

PCServerMgmt7 Web Windows NT/2000 Server DP&NM Lab 1 Contents 2 Windows NT Service Provider Management Application Web UI 3 . PC,, Client/Server Network 4 (1),,, PC Mainframe PC Backbone Server TCP/IP DCS PLC Network

More information

untitled

untitled Memory leak Resource 力 金 3-tier 見 Out of Memory( 不 ) Memory leak( 漏 ) 狀 Application Server Crash 理 Server 狀 Crash 類 JVM 說 例 行說 說 Memory leak Resource Out of Memory Memory leak Out of Memory 不論 Java heap

More information

3 S Q L A n t i p a t t e r n s Trees/intro/parent.sql CREATE TABLE Comments ( comment_id SERIAL PRIMARY KEY, parent_id BIGINT UNSIGNED, comment TEXT

3 S Q L A n t i p a t t e r n s Trees/intro/parent.sql CREATE TABLE Comments ( comment_id SERIAL PRIMARY KEY, parent_id BIGINT UNSIGNED, comment TEXT 3 S Q L A n t i p a t t e r n s Trees/intro/parent.sql CREATE TABLE Comments ( comment_id SERIAL PRIMARY KEY, parent_id BIGINT UNSIGNED, comment TEXT NOT NULL, FOREIGN KEY (parent_id) REFERENCES Comments(comment_id)

More information

Oracle9i Real Application Clusters

Oracle9i Real Application Clusters Senior Sales Consultant Oracle Corporation Oracle9i Real Application Clusters Agenda? ? (interconnect) (clusterware) Oracle9i Real Application Clusters computing is a breakthrough technology. The ability

More information

1. What is AX1 AX1 Program은 WIZnet 사의 Hardwired TCP/IP Chip인 iinchip 들의성능평가및 Test를위해제작된 Windows 기반의 PC Program이다. AX1은 Internet을통해 iinchip Evaluation

1. What is AX1 AX1 Program은 WIZnet 사의 Hardwired TCP/IP Chip인 iinchip 들의성능평가및 Test를위해제작된 Windows 기반의 PC Program이다. AX1은 Internet을통해 iinchip Evaluation 1. What is AX1 AX1 Program은 WIZnet 사의 Hardwired TCP/IP Chip인 iinchip 들의성능평가및 Test를위해제작된 Windows 기반의 PC Program이다. AX1은 Internet을통해 iinchip Evaluation Board(EVB B/D) 들과 TCP/IP Protocol로연결되며, 연결된 TCP/IP

More information

Tablespace On-Offline 테이블스페이스 온라인/오프라인

Tablespace On-Offline 테이블스페이스 온라인/오프라인 2018/11/10 12:06 1/2 Tablespace On-Offline 테이블스페이스온라인 / 오프라인 목차 Tablespace On-Offline 테이블스페이스온라인 / 오프라인... 1 일반테이블스페이스 (TABLESPACE)... 1 일반테이블스페이스생성하기... 1 테이블스페이스조회하기... 1 테이블스페이스에데이터파일 (DATA FILE) 추가

More information

ePapyrus PDF Document

ePapyrus PDF Document Goodus 기술노트 [38 회 ] Author 윤병길, 이은정 Creation Date 2009-02-27 Last Updated Version 1.0 Copyright(C) 2004 Goodus Inc. All Rights Reserved Version 변경일자변경자 ( 작성자 ) 주요내용 1 2009-02-27 윤병길, 이은정문서최초작성 Contents

More information

DB 성능고도화핵심원리 비투엔컨설팅 수석컨설턴트 조시형

DB 성능고도화핵심원리 비투엔컨설팅 수석컨설턴트 조시형 DB 성능고도화핵심원리 비투엔컨설팅 수석컨설턴트 조시형 원리를알아야답이보인다!! SQL 개발자 (Developer) 데이터모델을통해업무를이해하고, SQL 을정확히구사하는능력 DB 성능고도화전문가양성 SQL 전문가 (Professional) 성능을고려한고급 SQL 작성능력 DB 성능고도화핵심원리실습문제 declare l_ 수납금액 number; begin for

More information

문서 템플릿

문서 템플릿 HDSI 툴분석 [sql injection 기술명세서 ] Sql injection 기술명세서 Ver. 0.01 이문서는 sql injection 기술명세가범위입니다. Copyrights Copyright 2009 by CanvasTeam@SpeeDroot( 장경칩 ) All Rights Reserved. 장경칩의사전승인없이본내용의전부또는일부에대한복사, 전재,

More information

결과보고서

결과보고서 오픈 소스 데이터베이스 시스템을 이용한 플래시 메모리 SSD 기반의 질의 최적화 기법 연구 A Study on Flash-based Query Optimizing in PostgreSQL 황다솜 1) ㆍ안미진 1) ㆍ이혜지 1) ㆍ김지민 2) ㆍ정세희 2) ㆍ이임경 3) ㆍ차시언 3) 성균관대학교 정보통신대학 1) ㆍ시흥매화고등학교 2) ㆍ용화여자고등학교 3)

More information

강의 개요

강의 개요 DDL TABLE 을만들자 웹데이터베이스 TABLE 자료가저장되는공간 문자자료의경우 DB 생성시지정한 Character Set 대로저장 Table 생성시 Table 의구조를결정짓는열속성지정 열 (Clumn, Attribute) 은이름과자료형을갖는다. 자료형 : http://dev.mysql.cm/dc/refman/5.1/en/data-types.html TABLE

More information

InsertColumnNonNullableError(#colName) 에해당하는메시지출력 존재하지않는컬럼에값을삽입하려고할경우, InsertColumnExistenceError(#colName) 에해당하는메시지출력 실행결과가 primary key 제약에위배된다면, Ins

InsertColumnNonNullableError(#colName) 에해당하는메시지출력 존재하지않는컬럼에값을삽입하려고할경우, InsertColumnExistenceError(#colName) 에해당하는메시지출력 실행결과가 primary key 제약에위배된다면, Ins Project 1-3: Implementing DML Due: 2015/11/11 (Wed), 11:59 PM 이번프로젝트의목표는프로젝트 1-1 및프로젝트 1-2에서구현한프로그램에기능을추가하여간단한 DML을처리할수있도록하는것이다. 구현한프로그램은 3개의 DML 구문 (insert, delete, select) 을처리할수있어야한다. 테이블데이터는파일에저장되어프로그램이종료되어도사라지지않아야한다.

More information

10.ppt

10.ppt : SQL. SQL Plus. JDBC. SQL >> SQL create table : CREATE TABLE ( ( ), ( ),.. ) SQL >> SQL create table : id username dept birth email id username dept birth email CREATE TABLE member ( id NUMBER NOT NULL

More information

Spring Boot/JDBC JdbcTemplate/CRUD 예제

Spring Boot/JDBC JdbcTemplate/CRUD 예제 Spring Boot/JDBC JdbcTemplate/CRUD 예제 오라클자바커뮤니티 (ojc.asia, ojcedu.com) Spring Boot, Gradle 과오픈소스인 MariaDB 를이용해서 EMP 테이블을만들고 JdbcTemplate, SimpleJdbcTemplate 을이용하여 CRUD 기능을구현해보자. 마리아 DB 설치는다음 URL 에서확인하자.

More information

2002년 2학기 자료구조

2002년 2학기 자료구조 자료구조 (Data Structures) Chapter 1 Basic Concepts Overview : Data (1) Data vs Information (2) Data Linear list( 선형리스트 ) - Sequential list : - Linked list : Nonlinear list( 비선형리스트 ) - Tree : - Graph : (3)

More information

example code are examined in this stage The low pressure pressurizer reactor trip module of the Plant Protection System was programmed as subject for

example code are examined in this stage The low pressure pressurizer reactor trip module of the Plant Protection System was programmed as subject for 2003 Development of the Software Generation Method using Model Driven Software Engineering Tool,,,,, Hoon-Seon Chang, Jae-Cheon Jung, Jae-Hack Kim Hee-Hwan Han, Do-Yeon Kim, Young-Woo Chang Wang Sik, Moon

More information

chap 5: Trees

chap 5: Trees 5. Threaded Binary Tree 기본개념 n 개의노드를갖는이진트리에는 2n 개의링크가존재 2n 개의링크중에 n + 1 개의링크값은 null Null 링크를다른노드에대한포인터로대체 Threads Thread 의이용 ptr left_child = NULL 일경우, ptr left_child 를 ptr 의 inorder predecessor 를가리키도록변경

More information

NoSQL

NoSQL MongoDB Daum Communications NoSQL Using Java Java VM, GC Low Scalability Using C Write speed Auto Sharding High Scalability Using Erlang Read/Update MapReduce R/U MR Cassandra Good Very Good MongoDB Good

More information

SQL Developer Connect to TimesTen 유니원아이앤씨 DB 기술지원팀 2010 년 07 월 28 일 문서정보 프로젝트명 SQL Developer Connect to TimesTen 서브시스템명 버전 1.0 문서명 작성일 작성자

SQL Developer Connect to TimesTen 유니원아이앤씨 DB 기술지원팀 2010 년 07 월 28 일 문서정보 프로젝트명 SQL Developer Connect to TimesTen 서브시스템명 버전 1.0 문서명 작성일 작성자 SQL Developer Connect to TimesTen 유니원아이앤씨 DB 팀 2010 년 07 월 28 일 문서정보 프로젝트명 SQL Developer Connect to TimesTen 서브시스템명 버전 1.0 문서명 작성일 2010-07-28 작성자 김학준 최종수정일 2010-07-28 문서번호 20100728_01_khj 재개정이력 일자내용수정인버전

More information

Microsoft PowerPoint - chap06-2pointer.ppt

Microsoft PowerPoint - chap06-2pointer.ppt 2010-1 학기프로그래밍입문 (1) chapter 06-2 참고자료 포인터 박종혁 Tel: 970-6702 Email: jhpark1@snut.ac.kr 한빛미디어 출처 : 뇌를자극하는 C프로그래밍, 한빛미디어 -1- 포인터의정의와사용 변수를선언하는것은메모리에기억공간을할당하는것이며할당된이후에는변수명으로그기억공간을사용한다. 할당된기억공간을사용하는방법에는변수명외에메모리의실제주소값을사용하는것이다.

More information

Portal_9iAS.ppt [읽기 전용]

Portal_9iAS.ppt [읽기 전용] Application Server iplatform Oracle9 A P P L I C A T I O N S E R V E R i Oracle9i Application Server e-business Portal Client Database Server e-business Portals B2C, B2B, B2E, WebsiteX B2Me GUI ID B2C

More information

Intra_DW_Ch4.PDF

Intra_DW_Ch4.PDF The Intranet Data Warehouse Richard Tanler Ch4 : Online Analytic Processing: From Data To Information 2000. 4. 14 All rights reserved OLAP OLAP OLAP OLAP OLAP OLAP is a label, rather than a technology

More information

CD-RW_Advanced.PDF

CD-RW_Advanced.PDF HP CD-Writer Program User Guide - - Ver. 2.0 HP CD-RW Adaptec Easy CD Creator Copier, Direct CD. HP CD-RW,. Easy CD Creator 3.5C, Direct CD 3.0., HP. HP CD-RW TEAM ( 02-3270-0803 ) < > 1. CD...3 CD...5

More information

Oracle Wait Interface Seminar

Oracle Wait Interface Seminar 1 대용량 DBMS 의효율적인 모니터링및성능관리방안 Copyrights 2001~2007, EXEM Co., LTD. All rights reserved. 목차 2 1. 성능문제와 OWI 분석방법론 2. OWI 구성요소 3. Latch & LOCK 4. Oracle I/O 5. Cache Buffer 3 성능문제와 OWI 분석방법론 성능지연사례 1) 평소에

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 System Software Experiment 1 Lecture 5 - Array Spring 2019 Hwansoo Han (hhan@skku.edu) Advanced Research on Compilers and Systems, ARCS LAB Sungkyunkwan University http://arcs.skku.edu/ 1 배열 (Array) 동일한타입의데이터가여러개저장되어있는저장장소

More information

강의10

강의10 Computer Programming gdb and awk 12 th Lecture 김현철컴퓨터공학부서울대학교 순서 C Compiler and Linker 보충 Static vs Shared Libraries ( 계속 ) gdb awk Q&A Shared vs Static Libraries ( 계속 ) Advantage of Using Libraries Reduced

More information

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 (   ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각 JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( http://java.sun.com/javase/6/docs/api ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각선의길이를계산하는메소드들을작성하라. 직사각형의가로와세로의길이는주어진다. 대각선의길이는 Math클래스의적절한메소드를이용하여구하라.

More information

KEEP BUFFER 활용방안 엑셈컨설팅본부 /DB 컨설팅팀장정민 개요 Oracle 은유저가요청한작업을빠르게처리하기위해 Buffer Cache 라는것을사용한다. Buffer Cache 는 SGA 에위치하고있으며, 오라클인스턴스에접속하는모든프로세스에의해공유된다. 이 Bu

KEEP BUFFER 활용방안 엑셈컨설팅본부 /DB 컨설팅팀장정민 개요 Oracle 은유저가요청한작업을빠르게처리하기위해 Buffer Cache 라는것을사용한다. Buffer Cache 는 SGA 에위치하고있으며, 오라클인스턴스에접속하는모든프로세스에의해공유된다. 이 Bu KEEP BUFFER 활용방안 엑셈컨설팅본부 /DB 컨설팅팀장정민 개요 Oracle 은유저가요청한작업을빠르게처리하기위해 Buffer Cache 라는것을사용한다. Buffer Cache 는 SGA 에위치하고있으며, 오라클인스턴스에접속하는모든프로세스에의해공유된다. 이 Buffer Cache 는오라클 I/O 관리의핵심으로자주사용하는데이터파일의블록들을메모리에상주시킴으로써물리적인

More information

ALTIBASE HDB Patch Notes

ALTIBASE HDB Patch Notes ALTIBASE HDB 6.3.1.10.6 Patch Notes 목차 BUG-45060 offline replication start 와 replication drop 을동시에수행하는경우, replication start 가완료되지않았으면 replication drop 을수행하지못하도록수정하였습니다... 4 BUG-46193 메모리테이블의이중화병렬 sync

More information

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx #include int main(void) { int num; printf( Please enter an integer "); scanf("%d", &num); if ( num < 0 ) printf("is negative.\n"); printf("num = %d\n", num); return 0; } 1 학습목표 을 작성하면서 C 프로그램의

More information

Microsoft Word - FunctionCall

Microsoft Word - FunctionCall Function all Mechanism /* Simple Program */ #define get_int() IN KEYOARD #define put_int(val) LD A val \ OUT MONITOR int add_two(int a, int b) { int tmp; tmp = a+b; return tmp; } local auto variable stack

More information

윈도우즈프로그래밍(1)

윈도우즈프로그래밍(1) 제어문 (2) For~Next 문 윈도우즈프로그래밍 (1) ( 신흥대학교컴퓨터정보계열 ) 2/17 Contents 학습목표 프로그램에서주어진특정문장을부분을일정횟수만큼반복해서실행하는문장으로 For~Next 문등의구조를이해하고활용할수있다. 내용 For~Next 문 다중 For 문 3/17 제어문 - FOR 문 반복문 : 프로그램에서주어진특정문장들을일정한횟수만큼반복해서실행하는문장

More information

1217 WebTrafMon II

1217 WebTrafMon II (1/28) (2/28) (10 Mbps ) Video, Audio. (3/28) 10 ~ 15 ( : telnet, ftp ),, (4/28) UDP/TCP (5/28) centralized environment packet header information analysis network traffic data, capture presentation network

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 Chapter 06 반복문 01 반복문의필요성 02 for문 03 while문 04 do~while문 05 기타제어문 반복문의의미와필요성을이해한다. 대표적인반복문인 for 문, while 문, do~while 문의작성법을 알아본다. 1.1 반복문의필요성 반복문 동일한내용을반복하거나일정한규칙으로반복하는일을수행할때사용 프로그램을좀더간결하고실제적으로작성할수있음.

More information

Simplify your Job Automatic Storage Management DB TSC

Simplify your Job Automatic Storage Management DB TSC Simplify your Job Automatic Storage Management DB TSC 1. DBA Challenges 2. ASM Disk group 3. Mirroring/Striping/Rebalancing 4. Traditional vs. ASM 5. ASM administration 6. ASM Summary Capacity in Terabytes

More information

다양한 예제로 쉽게 배우는 오라클 SQL 과 PL/SQL

다양한 예제로 쉽게 배우는 오라클 SQL 과 PL/SQL 다양한예제로쉽게배우는 오라클 SQL 과 PL/SQL 서진수저 4 장 JOIN 을배웁니다 1 2 1. Cartesian Product ( 카티션곱, CROSS Join) - Oracle Join 문법 SQL> SELECT e.ename, d.dname 2 FROM emp e, dept d ; - ANSI Join 문법 SQL> SELECT e.ename, d.dname

More information

Microsoft Word - 05_SUBPROGRAM.doc

Microsoft Word - 05_SUBPROGRAM.doc ORACLE SUBPROGRAM INTRODUCTION PLSQL 은오라클에서제공하는프로그래밍언어이다. 이는데이터베이스언어인 SQL 과함께효과적으로데이터베이스에접근할수있는방법을제공하고있다. Procedural LanguageSQL 의약자에서볼수있듯이절차적인기능을기본적으로가지는프로그래밍언어이다. PLSQL 은기본적으로블록 (BLOCK) 구조를가지고있다. 블록의기본적인구성은선언부

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 Programming Languages 모듈과펑터 2016 년봄학기 손시운 (ssw5176@kangwon.ac.kr) 담당교수 : 임현승교수님 모듈 (module) 관련있는정의 ( 변수또는함수 ) 를하나로묶은패키지 예약어 module과 struct end를사용하여정의 아래는모듈의예시 ( 우선순위큐, priority queue) # module PrioQueue

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 실습 1 배효철 th1g@nate.com 1 목차 조건문 반복문 System.out 구구단 모양만들기 Up & Down 2 조건문 조건문의종류 If, switch If 문 조건식결과따라중괄호 { 블록을실행할지여부결정할때사용 조건식 true 또는 false값을산출할수있는연산식 boolean 변수 조건식이 true이면블록실행하고 false 이면블록실행하지않음 3

More information

I T C o t e n s P r o v i d e r h t t p : / / w w w. h a n b i t b o o k. c o. k r

I T C o t e n s P r o v i d e r h t t p : / / w w w. h a n b i t b o o k. c o. k r I T C o t e n s P r o v i d e r h t t p : / / w w w. h a n b i t b o o k. c o. k r -------------------------------------------------------------------- -- 1. : ts_cre_bonsa.sql -- 2. :

More information

6주차.key

6주차.key 6, Process concept A program in execution Program code PCB (process control block) Program counter, registers, etc. Stack Heap Data section => global variable Process in memory Process state New Running

More information

PRO1_04E [읽기 전용]

PRO1_04E [읽기 전용] Siemens AG 1999 All rights reserved File: PRO1_04E1 Information and S7-300 2 S7-400 3 EPROM / 4 5 6 HW Config 7 8 9 CPU 10 CPU : 11 CPU : 12 CPU : 13 CPU : / 14 CPU : 15 CPU : / 16 HW 17 HW PG 18 SIMATIC

More information

Microsoft PowerPoint - [2009] 02.pptx

Microsoft PowerPoint - [2009] 02.pptx 원시데이터유형과연산 원시데이터유형과연산 원시데이터유형과연산 숫자데이터유형 - 숫자데이터유형 원시데이터유형과연산 표준입출력함수 - printf 문 가장기본적인출력함수. (stdio.h) 문법 ) printf( Test printf. a = %d \n, a); printf( %d, %f, %c \n, a, b, c); #include #include

More information

OCW_C언어 기초

OCW_C언어 기초 초보프로그래머를위한 C 언어기초 4 장 : 연산자 2012 년 이은주 학습목표 수식의개념과연산자및피연산자에대한학습 C 의알아보기 연산자의우선순위와결합방향에대하여알아보기 2 목차 연산자의기본개념 수식 연산자와피연산자 산술연산자 / 증감연산자 관계연산자 / 논리연산자 비트연산자 / 대입연산자연산자의우선순위와결합방향 조건연산자 / 형변환연산자 연산자의우선순위 연산자의결합방향

More information

Cache_cny.ppt [읽기 전용]

Cache_cny.ppt [읽기 전용] Application Server iplatform Oracle9 A P P L I C A T I O N S E R V E R i Improving Performance and Scalability with Oracle9iAS Cache Oracle9i Application Server Cache... Oracle9i Application Server Web

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 @ Lesson 2... ( ). ( ). @ vs. logic data method variable behavior attribute method field Flow (Type), ( ) member @ () : C program Method A ( ) Method B ( ) Method C () program : Java, C++, C# data @ Program

More information

Microsoft Word - [2017SMA][T8]OOPT_Stage_2040 ver2.docx

Microsoft Word - [2017SMA][T8]OOPT_Stage_2040 ver2.docx OOPT Stage 2040 - Design Feesual CPT Tool Project Team T8 Date 2017-05-24 T8 Team Information 201211347 박성근 201211376 임제현 201411270 김태홍 2017 Team 8 1 Table of Contents 1. Activity 2041. Design Real Use

More information

강의 개요

강의 개요 정규화와 SELECT (II) 웹데이터베이스 학과 학생 과목 학과 지도교수 학과학번성명 수강과목 담당교수 A 김수정 A 0001 고길동 성질이론 김수정 B 허영만 A 0002 둘리 한식의멋 허영만 C 강풀 B 0003 희동이 심리학의이해 강풀 과목 _ 성적 학번 수강과목 성적 0001 성질이론 A 0001 한식의멋 C 0002 성질이론 A 0002 한식의멋

More information

Infinity(∞) Strategy

Infinity(∞) Strategy 반복제어 표월성 passwd74@cherub.sungkyul.edu 개요 for() 문 break문과 continue문 while문 do-while문 for() 문 for() 문형식 for( 표현식1; 표현식2; 표현식3) 여러문장들 ; 표현식 1 : 초기화 (1 번만수행 ) 표현식 2 : 반복문수행조건 ( 없으면무한반복 ) 표현식 3 : 반복문수행횟수 for()

More information

Microsoft PowerPoint - e pptx

Microsoft PowerPoint - e pptx Import/Export Data Using VBA Objectives Referencing Excel Cells in VBA Importing Data from Excel to VBA Using VBA to Modify Contents of Cells 새서브프로시저작성하기 프로시저실행하고결과확인하기 VBA 코드이해하기 Referencing Excel Cells

More information

<49534F20323030303020C0CEC1F520BBE7C8C4BDC9BBE720C4C1BCB3C6C320B9D7204954534D20BDC3BDBAC5DB20B0EDB5B5C8AD20C1A6BEC8BFE4C3BBBCAD2E687770>

<49534F20323030303020C0CEC1F520BBE7C8C4BDC9BBE720C4C1BCB3C6C320B9D7204954534D20BDC3BDBAC5DB20B0EDB5B5C8AD20C1A6BEC8BFE4C3BBBCAD2E687770> ISO 20000 인증 사후심사 컨설팅 및 ITSM 시스템 고도화를 위한 제 안 요 청 서 2008. 6. 한 국 학 술 진 흥 재 단 이 자료는 한국학술진흥재단 제안서 작성이외의 목적으로 복제, 전달 및 사용을 금함 목 차 Ⅰ. 사업개요 1 1. 사업명 1 2. 추진배경 1 3. 목적 1 4. 사업내용 2 5. 기대효과 2 Ⅱ. 사업추진계획 4 1. 추진체계

More information

오라클 데이터베이스 10g 핵심 요약 노트

오라클 데이터베이스 10g 핵심 요약 노트 1 10g 10g SYSAUX 10g 22 Oracle Database 10g, 10g. 10g. (Grid), 10g.. 10g SYSAUX (ASM, Automatic Storage Management) 10g 10g. g. (DBA).,., 1).,..? 10g,.. (Larry Ellison).. (Leverage Components), (ASM) (

More information

기술노트 49 회 SQL PLAN MANAGEMENT Author 윤병길과장 Creation Date Last Updated Version 1.0 Copyright(C) 2009 Goodus Inc. All Rights Reserved

기술노트 49 회 SQL PLAN MANAGEMENT Author 윤병길과장 Creation Date Last Updated Version 1.0 Copyright(C) 2009 Goodus Inc. All Rights Reserved 기술노트 49 회 SQL PLAN MANAGEMENT Author 윤병길과장 Creation Date 2010-06-01 Last Updated Version 1.0 Copyright(C) 2009 Goodus Inc. All Rights Reserved Contents 1. SQL PLAN MANAGEMENT OVERVIEW... 3 1.1. INTRODUCTION...

More information

Microsoft PowerPoint - ch09 - 연결형리스트, Stack, Queue와 응용 pm0100

Microsoft PowerPoint - ch09 - 연결형리스트, Stack, Queue와 응용 pm0100 2015-1 프로그래밍언어 9. 연결형리스트, Stack, Queue 2015 년 5 월 4 일 교수김영탁 영남대학교공과대학정보통신공학과 (Tel : +82-53-810-2497; Fax : +82-53-810-4742 http://antl.yu.ac.kr/; E-mail : ytkim@yu.ac.kr) 연결리스트 (Linked List) 연결리스트연산 Stack

More information

MAX+plus II Getting Started - 무작정따라하기

MAX+plus II Getting Started - 무작정따라하기 무작정 따라하기 2001 10 4 / Version 20-2 0 MAX+plus II Digital, Schematic Capture MAX+plus II, IC, CPLD FPGA (Logic) ALTERA PLD FLEX10K Series EPF10K10QC208-4 MAX+plus II Project, Schematic, Design Compilation,

More information

Slide 1

Slide 1 1 EM Performance & Resource Management 최야벳 (yabet.choi@oracle.com) Sales Consultant Oracle Direct Agenda Intro 관리자의고민 기존시스템관리의문제점 About EM Case Demo Lock 경합 성능튜닝권고 ( 파라미터 ) Instance

More information

Microsoft PowerPoint - 알고리즘_1주차_2차시.pptx

Microsoft PowerPoint - 알고리즘_1주차_2차시.pptx Chapter 2 Secondary Storage and System Software References: 1. M. J. Folk and B. Zoellick, File Structures, Addison-Wesley. 목차 Disks Storage as a Hierarchy Buffer Management Flash Memory 영남대학교데이터베이스연구실

More information