반응형

오라클 18

인덱스와 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 메모리..

DB/Oracle 2025.04.30

현재 진행중인 쿼리확인 (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';현재 활성화 되어있는 쿼리가 출력된다. 두번째는 실질적으로 쿼리를 ..

DB/Oracle 2025.03.25

pivot (오라클11g)

프로젝트를 진행하다보면 통계를 뽑아서 출력해야되는 경우가 생긴다.아래는 예시 데이터이다 데이터를 보면 운동한 종목과 요일별로 데이터가 들어가있다.저 데이터를 종목별로 어느요일에 몇 세트를 했는지 표시하기 위해 어떻게 해야할까 가장 먼저 떠오르는건 반복문이다.저 데이터를 통째로 가져와서 for 문을 돌며 해당 요일에 맞는 데이터가 있으면 배열같은곳에 저장하고...다시 날짜별로 저장해둔 데이터를 반복하여 출력하는 식으로도 할 수 있을것이다.(별로다)  두번째로는 각 종목별이나 날짜별로 조건을 줘서 데이터를 가져오는 방식이다.출력하는데에는 1번 방법보다는 편할수 있으나 DB를 여러번 SELECT 하게 되는 문제점이 있다.  세번째로는 DECODE를 활용하는것이다.오라클 11 버전 이전에는 pivot이 없었기에..

DB/Oracle 2025.03.14

테이블 생성시 유의사항

아래 와 같이 특정 글자 수로 저의되는 형태는 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', ..

DB 2024.10.17

오라클 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/Oracle 2024.10.17

오라클 구분자를 사용한 문자열을 행으로 변환(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..

DB/Oracle 2024.10.17

오라클,MySQL 특정 문자 정렬

리스트를 출력하다보면 특정문자로 정렬해서 나타내야되는 경우가있다.​예를들어 데이터 중 필드에 '완료'가 된 데이터를 먼저 출력해야될때가 있다면오라클의경우SELECT * FROM T_TABLE ORDER BY DECODE(F_STATUS,'완료',1);이런식으로 오라클 내장 함수인 DECODE를 사용하여 F_STATUS에 완료인 필드들을 1순위로 출력해주면 된다. ​Mysql(MariaDB)의경우SELECT * FROM T_TABLE ORDER BY FIELD(F_STATUS,'가','가나다') DESC;Mysql의 경우 FIELD함수를 사용하여 위와같이 1순위 '가', 2순위 '가나다' 라는 단어가 필드에 들어가는 데이터 우선정렬을 출력해줄 수 있다.​오라클과 Mysql의 다른점은 오라클 DECODE의 ..

DB 2024.10.17

drop 테이블 복구

drop table 테이블명 으로 삭제한 테이블을 복구하는 방법이다주의점으로는1. purge 를 사용하여 삭제한 테이블의 경우에는 복구되지 않는다.2. 복구한 테이블의 index명은 달라진다.  1. 휴지통에 있는 데이터 조회SELECT * FROM RECYCLEBIN- 삭제된 정보가 나오며 ORIGINAL_NAME과 OPERATION을 활용하여 복구가 가능하다. 2. 테이블 복구하기FLASHBACK TABLE 테이블명 TO BEFORE DROP 이름으로 복구할 때, 동일테이블명에 대해 여러오브젝트가 휴지통에 있는경우가장 최근 삭제된 순서로 Flashback(복구) 된다. 3. 특정 테이블 휴지통에서 제거-- 휴지통에서 삭제하려는 테이블의 ID (OBJECT_NAME)에 쌍따옴표로 감싸야 한다.PURGE..

DB/Oracle 2024.08.07

오라클 DB링크

오라클의 DB의 실제 운영서버에서 개발서버 쪽으로 데이터를 옮겨야하는 상황이 있었다.예전이였으면 데이터를 파일로뽑고, 그 데이터를 sqlldr로 넣는 방식으로 옮겼겠지만 이번엔 DB링크로 옮기게 되었다. 기존에 같은 서버에서 다른 스키마의 DB까지는 접근해서 사용했는데 다른 서버의 DB를 가져오는 링크는 처음 만들어봤다. (DBA한테 허락을 받았다) 자 만들어보자CREATE DATABASE LINK LIVE_MY_MAP -- 링크로 사용할 이름CONNECT TO MYMAP -- 링크할 서비스 DB 이름IDENTIFIED BY "TESTPWD123" -- 비밀번호 쌍따옴표 필수USING '(DESCRIPTION = (ADDRESS_LIST = (ADDRESS =..

DB/Oracle 2024.07.05
반응형