본문 바로가기

ORACLE

오라클에서 현재 연결되어 있는 session 확인 기본적으로 system 계정으로 접속 후 SELECT * FROM v$session 을 보면 현재 연결되어있는 모든 세션을 볼 수 있다.. 현재 active상태인 것과 inactive상태인것을 확인하려면ㅇ SELECT status,COUNT(*) FROM v$session WHERE username=? GROUP BY status 애플리케이션에서 설정되어있는 최대 connection 갯수가 저 위 두개의 합보다 적을 경우에 문제가 발생 할 수 있다.. inactive상태의 세션을 일정 시간이 지난 후 제거할 수 있도록 설정 할 수 있는데 ALTER SYSTEM SET RESOURCE_LIMIT =TRUE; CREATE PROFILE [Profile name] LIMIT IDLE_TIME [M분]; ALT.. 더보기
OUTTER JOIN과 JOIN에서의 드라이브 CUSTOMER라는 테이블과 ORDER라는 테이블이 있다고 가정. CUSTOMER에는 custname과 zip-code,custno(pk) index는 zip-code 건수는 200만건 ORDER에는 orderno(pk),orderdate,orderprice,custno,ordername가 있다고 가정. index는 custno+orderdate 건수는 3천만건 특정지역에 사는 고객이 주문한 주문내역을 1개월치를 뽑는다고 할때 1.select B.custname, A.ordername from order A, cust B where A.custno = B.custno(+) and B.zip-code = :v1 and A.orderdate like '200504%' 와 2.select B.custname,.. 더보기
PCT Free와 PCT Used 테이블을 create할때 주는 파라메터 중 pct free와 pct used라는 것이 있다. pct free란? 오라클의 블록 크기를 4k로 잡았다고 가정하고 이 4k에 데이터가 100% 꽉 차있다고 하자. 이 레코드 중 update로 인해 데이터의 크기가 늘어나게 되면 (ex a->abc로 update) 4k 블록안에는 들어갈 자리가 없으므로 다른 4k짜리 블록을 새로 할당하여 레코드를 링크하게 되고 이를 블락 체인이라고 하며 이는 오라클 6일때까지 일어났던 현상이다. 하나의 레코드를 읽기 위해 여러 다른 블록을 access해야 하므로 속도가 많이 떨어지게 된다. (데이터베이스 속도에 지대한 영향을 미치는 것은 I/O) 이를 향상하게 위해 나온 것이 로우 마이그레이션이다. (oracle 7 부터..) .. 더보기
delete와 commit, rollback 3천만건 짜리 테이블을 delete from table3000만 하면.. 한 2시간 걸려서 3천만 record deleted라고 나올 것이다. 이때 실제 디스크에서 데이터가 삭제 되었을까..? 여기서 commit을 하면 0.1초만에 committed라고 나오지만 rollback을 치면 다시 2시간 정도가 걸려야지만 rollback이 완료된다. delete중 시스템을 내려버리면? 다시 시스템을 올릴때 delete하기전의 데이터로 복구를 해놓으며 이것 역시 delete한 만큼의 시간이 소요된다. delete를 하게되면 실제 commit을 하지 않더라도 데이터를 삭제되고 있으며 이를 rollback을 하게 되면 롤백 세그멘트에서 다시 예전 데이터를 가져와서 rollback을 시키기 때문에 시간이 올래걸리는 것.. 더보기
부분범위 처리 emp란 테이블에 2천만건의 데이터가 있다고 할때 select * from emp와 select * from emp where name like '장%' 이 두개의 결과는 전자가 더 빠르게 나올 수 있다. (물론 인덱스가 없다고 가정..) 왜냐하면 풀스캔을 할 경우 그냥 차례대로 읽어내려가면 되기 때문에 오라클이 가지고 있는 버퍼 사이즈에 도달하게 되면 비록 2천만건을 다 읽지 않았더라도 화면으로 내보내기 때문이다. 반면 like '장%'라는 조건이 들어가면 버퍼 사이즈에 읽어들인 데이터가 다 찰때까지 테이블을 스캔해 내려가야 하기 때문에 속도가 훨씬 늦어지는 것이다. 인덱스가 있다면 얘기가 달라지겠지만.... 전체범위 처리의 예를 몇가지 더 보면 select date from order order by.. 더보기
Index Merge 방식의 실행계획 주문내역이라는 chol이라는 테이블이 있을때 인덱스는 고객넘버인 custno+ 처리상태값인 status로 잡혀있다고 하면 select * from chol where custno='30' and status='90'; 을 실행할때 인덱스 merge방식을 사용하게 된다. 두개의 조건에 대해 모두 인덱스가 잡혀있고 조건이 '='로서 처리 우선 순위가 동일하기 때문이다. 인덱스는 같은 값을때는 rowid순으로 sort가 되어있다. 예를 들어 idx_custno idx_status 10 row1 30 row2 10 row30 30 row3 10 row31 30 row10 10 row40 90 row20 30 row 54 90 row30 30 row 55 90 row54 30 row 60 90 row57 30 r.. 더보기
EQUAL이 결합인덱스에 미치는 영향 2개의 컬럼으로 이루어진 결합인덱스가 있다고 할때 col1+col2.. col2 col1 rowid 110 A 110 B 111 A 111 B 111 C 112 A 112 B 113 B 114 A 다음과 같은 쿼리를 생각해보면 select * from tab1 where col1='A' and col2 between '111' and '113' 위의 경우처럼 col2이 인덱스 앞에 있을 경우 위의 쿼리는 col2를 111에서부터 113을 모두 스캔하여 그중 col1이 A인 것을 찾아내게 된다. 즉 인덱스스캔 7, 테이블 access는 2회 왜냐하면 옵티마이저나 dbms는 111과 113사이에 뭐가 있는지 알 수 없기 때문이다. 111.1이 있는지 112.2가 있는지 알 수 없기 때문에 between조건에.. 더보기
index의 바인딩 변수 조건에 따른 선택 A 업체에서 운영하는 교육센터가 있다고 할때 아무래도 이 교육센터에서 교육을 받는 사람들은 대부분 그 A업체의 사람들일 것이다. 분포도가 만약 A업체 교육자가 90%, 나머지 타 업체가 10%라고 하면 검색을 할때 조건에 A업체 소속인 사람들... 이라고 나오면 fullscan이 유리하고 (분포도가 나쁘므로) 타 업체 소속인 사람들.... 이라고 한다면 index scan이 빠를 것이다. (분포도가 좋으므로..) 관리자의 화면에서 업체id를 입력받아 출력을 하는 부분이 있다고 할때 만약 sql을 (입력 받은 업체id는 바인딩변수 v1에 넣는다) (corp_id로 인덱스가 만들어져있음) select * from XXX where corp_id = :v1 단순하게 이렇게 만든다면.. A업체 id가 입력되었을.. 더보기
Not in과 not exist, outter join, SQL의 hit ratio보기 Select ... from Emp where dept_no not in (select dept_no from dept where dept_cat='a'); 보다는 아래와 같이 변경 case 1 select ... from emp a, dept b where a.dept_no = b.dept_no(+) and b.dept_no is null and b.dept_cat(+) = 'a' case 2 select ... from emp e where not exits (select '1' from dept d where d.dept_no = e.dept_no and d.dept_cat='a'); case1보다는 case2가 좀 더 나은 결과를 보여준다고 한다 -_- (확인 안 해봄..--;) SQL의 hit .. 더보기
& 바꾸기 오라클 쿼리에 & 넣으면 자꾸 입력값을 넣으라고 물어보는데. 입력갑 변수 키워드 & 를 다른 키워드로 세팅하느 방법좀 알려주세요. 이 글에 대한 댓글이 총 1건 있습니다. set define user_define_char 을 사용하시면 됩니다. 예를 들어, '^'로 바꾸시려면 set define ^ 이렇게 하시면 됩니다. 더보기