반응형

Oracle 18

TEMP 세그먼트 확장

당연한 이야기지만 모든 작업엔 임시 세그먼트 테이블이 있다.특정 작업시 저 테이블에서 작업 후 COMMIT 을 하는 방식으로 사용되는 테이블인데 너무 큰 작업시 TEMP 세그먼트 확장 오류라면서 작업이 진행되지않는다.나의 경우 1억건 정도 INSERT를 하는데 저 오류를 겪었다.가장 먼저 떠오르는 해결법은 단순히 테이블스페이스를 늘리는것인데... 서버 관리하는 분께 요청했지만 어차피 TEMP는 확장을 해줘도 나중에 더 대규모 데이터를 가공하여 INSERT 할 때 저런 오류가 또 생길텐데 그때는 어쩔거냐... 라는 답변과 함께 PL/SQL 를 사용해서 여러번 COMMIT 하던가 쿼리 최적화를 더 해보라고 하셨다.그래서 해결 방법을 좀 찾아봤다. 일단 내가 짰던 INSERT 문이다.INSERT /*+ APP..

DB/Oracle 2025.06.30

db 시퀀스 생성

새로운 프로젝트의 db설계를 하면서 각 테이블의 시퀀스를 생성하는 일이 생겼다.처음에는 그냥 예전부터 하던것 처럼 함수를 사용해서 고유값을 생성하려고했다.CREATE OR REPLACE FUNCTION FN_KM_GET_CODE ( p_table_name IN VARCHAR2)RETURN VARCHAR2IS v_seq_val NUMBER; v_new_id VARCHAR2(200);BEGIN IF p_table_name = 'T_TABLE1' THEN SELECT TABLE1_SEQ.NEXTVAL INTO v_seq_val FROM DUAL; v_new_id := 'T1_' || TO_CHAR(v_seq_val); ELSIF p_table_name = '..

DB/Oracle 2025.06.27

인덱스와 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

리눅스 DB 백업 및 복원

오라클 백업# 기본 명령어exp [사용자 이름]/[비밀번호] tables=[테이블 이름] file=[백업 파일 이름].dmp# 특정 테이블 백업exp 사용자이름/비밀번호 tables=테이블명 file=백업파일이름.dmp log=로그파일명.log direct=y compress=n statistics=none# 특정 테이블 여러개 동시백업exp 사용자이름/비밀번호 tables=TABLE1,TABLE2,TABLE3 file=백업파일이름.dmp statistics=none# 특정 사용자의 테이블 백업exp 사용자이름/비밀번호 owner=사용자이름 file=백업파일이름.dmp log=로그파일명.log direct=y compress=n statistics=none# DB전체백업(DBA 비밀번호필요)exp sys..

리눅스 2025.04.09

현재 진행중인 쿼리확인 (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

오라클,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
반응형