반응형

DB/Oracle 13

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

오라클 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

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

테이블 LOCK

작업을 하는데 특정 테이블의 update가 안되는 이슈가 있었다. 단순 오류가 아니라 update 쿼리 실행시 db가 그대로 잠겨 페이지 또한 올라오지 않았다. 원인을 먼저 찾아보기위해 세션을 확인하기 위한 쿼리를 실행했다. SELECT A.USERNAME AS 계정명, A.SCHEMANAME AS 스키마명, A.STATUS AS 활성화여부, A.SID AS 세션식별자, A.SERIAL# AS 시리얼번호, A.MACHINE AS OS머신명, A.PROGRAM AS OS프로그램명, A.TYPE AS 세션타입, A.LOGON_TIME AS 세션로그인날짜, B.FIRST_LOAD_TIME AS 처음실행한시각, B.SQL_TEXT AS 실행쿼리, C.TYPE AS 락타입 FROM V$SESSION A, V$SQ..

DB/Oracle 2024.04.16

오라클 인덱스관리

인덱스를 생성하면 테이블 select 속도가 빨라지는 것은 사실이나 용도에 맞게 인덱스를 생성해야한다. 그렇지 않으면 Full Table Scan 보다 느려지는 경우가 종종있다. (추가로 인덱스도 tablespace 용량을 꽤나 잡아먹는다.) 1) DML 쿼리문 주의 사항 ▶ insert 작업을 할 경우에 index split 현상이 발생할 수 있다. index split : 인덱스의 Block들이 하나에서 두 개로 나눠지는 현상 기존 블록에 여유공간이 없는 상황에서 새로운 데이터가 들어오면 기존 블록의 내용 중 일부를 새 블록에 기록한 후 기존 블록에 빈 공간을 만들어서 새로운 데이터를 추가하게 되며 속도가 느려진다. ▶ delete의 문제 delete를 하면 테이블의 데이터들은 지워지는데 인덱스는 지..

DB/Oracle 2024.03.22

오라클 현재 실행중인 쿼리확인

오라클에서 현재 실행중인 쿼리확인을 위한 쿼리 status가 ACTIVE인 것들로 조건을 줘서 검색하면 된다 SELECT a.sid, -- SID a.serial#, -- 시리얼번호 a.status, -- 상태정보 a.process, -- 프로세스정보 a.username, -- 유저 a.osuser, -- 접속자의 OS 사용자 정보 b.sql_text, -- sql c.program -- 접속 프로그램 FROM v$session a, v$sqlarea b, v$process c WHERE a.sql_hash_value=b.hash_value AND a.sql_address=b.address AND a.paddr=c.addr AND a.status='ACTIVE';

DB/Oracle 2024.03.22
반응형