본문 바로가기

DB

(21)
인덱스와 DB통계 오라클에서 쿼리를 실행시키는데 이상하게 특정 쿼리가 무한로딩이 걸리는 일이 생겼다.정확히는 특정 테이블에서만 발생했었다. 선결론 : 테이블의 통계정보 문제였다.ANALYZE 명령어로 해결되었다. 다음과 같은 쿼리였다.select COUNT(1) AS CNTfrom (select * from T_TAA where F_STATUS in ('W', 'P')) T1 join T_TBB T2 on T2.F_CD = T1.F_CD;일단 실행계획부터 확인해봤다.정상적으로 인덱스도 타고 cost 소모도 크지않았다. 두번째로 TEMP 사용량 체크SELECT tablespace_name, used_blocks, free_blocksFROM v$sort_segment;용량 문제 없었다. 세번째로 PGA 메모리..
현재 진행중인 쿼리확인 (dba) 웹에서 DB에 데이터 대해서 변경이나 조회를 할 때  여러가지 이유로 멈추는 경우가 종종 있다.(쿼리의 구조문제, LOCK 등등)이때 쿼리가 무한 WAIT에 걸린 경우 강제로 죽여야하는 경우가 생기는데 이때 사용하는 명령어다.해당 명령어는 직접 DB시스템에 접근하므로 DBA 권한으로 가능하다. 우선 진행중인 쿼리 확인용 쿼리다.SELECT s.username, s.osuser, s.program, sql.sql_text FROM v$session s, v$sql sql WHERE s.sql_address = sql.address AND s.sql_hash_value = sql.hash_value AND s.status = 'ACTIVE';현재 활성화 되어있는 쿼리가 출력된다. 두번째는 실질적으로 쿼리를 ..
pivot (오라클11g) 프로젝트를 진행하다보면 통계를 뽑아서 출력해야되는 경우가 생긴다.아래는 예시 데이터이다 데이터를 보면 운동한 종목과 요일별로 데이터가 들어가있다.저 데이터를 종목별로 어느요일에 몇 세트를 했는지 표시하기 위해 어떻게 해야할까 가장 먼저 떠오르는건 반복문이다.저 데이터를 통째로 가져와서 for 문을 돌며 해당 요일에 맞는 데이터가 있으면 배열같은곳에 저장하고...다시 날짜별로 저장해둔 데이터를 반복하여 출력하는 식으로도 할 수 있을것이다.(별로다)  두번째로는 각 종목별이나 날짜별로 조건을 줘서 데이터를 가져오는 방식이다.출력하는데에는 1번 방법보다는 편할수 있으나 DB를 여러번 SELECT 하게 되는 문제점이 있다.  세번째로는 DECODE를 활용하는것이다.오라클 11 버전 이전에는 pivot이 없었기에..
테이블 생성시 유의사항 아래 와 같이 특정 글자 수로 저의되는 형태는 DATA TYPE CHAR를 권장 스키마 CREAT 할때 같이 하면 됨 create table table_name ( F_FIELD_NAME char(12), CONSTRAINT ROLE_NAME_TEST CHECK (F_FIELD_NAME in ('a','b','c') ) );--table_name 이라는 테이블에 F_FIELD_NAME 필드에 값이 들어갈때 a,b,c 인지 체크 하는 룰----- 이하 생성 후 수정할 때ALTER TABLE table_name ADD CONSTRAINTCONSTRAINT ROLE_NAME_TEST CHECK ( F_FIELD_NAME IN ( 'FIELD1', 'FIELD2', 'FIELD3', 'FIELD4', ..
오라클 bulk insert 속도개선 오라클에 몇 천만 이상 건의 데이터를 insert 할 때는 속도가 안나오는 경우가 많았다.아래같은 쿼리를 사용하여 속도를 개선할 수 있었다.--기존 4분11초INSERT INTO T_MAIN_LOG SELECT * FROM T_TMP_LOG WHERE F_CD = 'CD1';COMMIT;--1. NOLOGGING 로그삭제ALTER TABLE T_MAIN_LOG NOLOGGING ;--2. /*+ append */ 추가--10초로 개선됨INSERT /*+ append */ INTO T_MAIN_LOG SELECT *FROM T_TMP_LOG WHERE F_CD = 'CD1';--3. 삭제했던 logging 다시추가ALTER TABLE T_MAIN_LOG LOGGING ;--주의점 rollback 못함 D..
db 테이블 명세서 작성 쿼리 SELECT A.TABLE_NAME AS TABLE_NAME, A.TAB_CMT AS 테이블설명, A.COLUMN_NAME AS 컬럼명, B.POS AS PK, A.COL_CMT AS 컬럼설명, A.DATA_TYPE AS 데이터유형, A.데이터길이, A.NULLABLE AS NULL여부, A.COLUMN_ID AS 컬럼순서, A.DATA_DEFAULT AS 기본값FROM(SELECT S1.TABLE_NAME, S3.COMMENTS AS TAB_CMT, S1.COLUMN_NAME, S2.COMMENTS AS COL_CMT, S1.DATA_TYP..
join 다중 업데이트 DB 사용중에 다중 업데이트를 사용해야하는 경우입니다.​고쳐야되는 상황) A테이블에 F_ID가 B테이블의 F_NAME과 같을 경우 B테이블의 F_ID로 전환시켜줘야한다.A 테이블의 있는 데이터를 B 테이블과 매치되는 경우에 한하여 업데이트를 해야해서 처음에는 MERGE 문을 사용했습니다.MERGE INTO T_SONG AUSING T_MEMBER BON (A.F_ID = B.F_NAME)WHEN MATCHEDTHENUPDATE SET A.F_ID = B.F_ID;이렇게 했더니 오류가 납니다.[99999][38104] ORA-38104: ON 절에서 참조되는 열은 갱신할 수 없음: "A"."F_ID"​이런식으로 MERGE문은 ON 절에서 참조되는 열은 업데이트에 사용할 수 없다고 합니다. ..
오라클 구분자를 사용한 문자열을 행으로 변환(regexp, connect by level) 해당 데이터 중 F_NATCD 열의 데이터를 | 로 구분하여 행으로 표현 할 것이다.​1. connected by level오라클에서의 for문이라고 보면된다. 조건을 넘지않는한 계속 반복하여 쿼리를 수행한다.select level from dual connect by level 2. REGEXP_REPLACE 정규식LENGTH(REGEXP_REPLACE(f_natcd,'[^|]+',''))+1 정규식과 LENGTH를 활용하여 구분자 개수만큼 반복실행할 수 있도록 해준다.ex) 데이터가 aaa | bbb | ccc 라면 REGEXP_REPLACE(f_natcd,'[^|]+','') 의 반환값은 | | 이 되고 LENGTH 값은 2가 나오게 된다.​ 3. REGEXP_SUBSTR 정규식2번의 REPLACE..

반응형