본문 바로가기

DB

(9)
mysql 시퀀스 오라클만 사용하다보니 mysql을 사용할 일이 거의 없어서 몰랐는데mysql에는 seq.nextval이 없었더라...그래서 찾아보니 함수로 만들수 있었다.단계는 4단계였다.시퀀스용 테이블 생성시퀀스 생성 프로시저 생성생성한 시퀀스의 다음 값 가져오는 함수 생성시퀀스를 생성 할 프로시저 실행이렇게 하면 이제 nextval 이라는 이름의 함수를 사용할 수 있게된다.만들어보자 시퀀스용 테이블 생성create table T_SEQ( NAME varchar(32), CURRVAL BIGINT UNSIGNED)ENGINE = InnoDBcomment '시퀀스용테이블';저기서 NAME을 기준으로 시퀀스가 배정된다.​2. 시퀀스 생성 프로시저 생성DELIMITER $$CREATE PROCEDURE `create_seq..
테이블 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..
오라클 인덱스관리 인덱스를 생성하면 테이블 select 속도가 빨라지는 것은 사실이나 용도에 맞게 인덱스를 생성해야한다. 그렇지 않으면 Full Table Scan 보다 느려지는 경우가 종종있다. (추가로 인덱스도 tablespace 용량을 꽤나 잡아먹는다.) 1) DML 쿼리문 주의 사항 ▶ insert 작업을 할 경우에 index split 현상이 발생할 수 있다. index split : 인덱스의 Block들이 하나에서 두 개로 나눠지는 현상 기존 블록에 여유공간이 없는 상황에서 새로운 데이터가 들어오면 기존 블록의 내용 중 일부를 새 블록에 기록한 후 기존 블록에 빈 공간을 만들어서 새로운 데이터를 추가하게 되며 속도가 느려진다. ▶ delete의 문제 delete를 하면 테이블의 데이터들은 지워지는데 인덱스는 지..
쿼리 속도차이 db를 처음짜기 시작했던 때에 짰던 쿼리가 하나 있다 SELECT ta.*, (select filed1 from T_TEST2 where test2_key = ta.test_key1) as name, (select decode(count(1), 0, 'X', 'O') from T_TEST3 where test3_key = ta.test_key2) as val FROM T_TEST1 ta where test_file1 = 'ok' order by test_field2; 딱 봐도 느리고 안좋다. 어쩔수없이 select문에 서브쿼리를 넣어서 특정 데이터를 가져올 때도 있긴하겠다만, 저 쿼리는 구조상 저러지 않아도된다. 주 테이블(T_TEST1)의 데이터 양이 많지 않다면 속도가 별로 느리지 않겠지만 양이 늘어..
오라클 현재 실행중인 쿼리확인 오라클에서 현재 실행중인 쿼리확인을 위한 쿼리 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';
ORACLE 데이터 문자,숫자(판별식) REGEXP_LIKE와 REGEXP_REPLACE 함수를 써서 정규식을 활용한 판별을 진행 ​ 1.정규식 [0-9] 숫자, [^0-9] 숫자 외의 것 [가-힣] 한글, [^가-힣] 한글 외의 것 [A-Z] 영어대문자, [^A-Z] 영어대문자 외의 것 (소문자도있음) ​ 2.WHERE 절에서 REGEXP_LIKE 사용 ⊙ 기본 LIKE 문처럼 정규식에 포함된 문자 하나라도 있으면 조회된다. ⊙ NOT을 사용하면 해당 문자가 포함되지않은 데이터가 조회된다 ⊙ ^정규식에 NOT을 사용하여 해당 문자가 아닌 모든것을 제외하므로써 해당 문자만 포함되어있는 데이터만 조회된다 EX) WHERE REGEXP_LIKE(컬럼, '[0-9]') --데이터에 숫자가 하나라도 포함되면 조회 WHERE REGEXP_LIKE(컬럼..
오라클 삭제한 데이터 복구 기본 쿼리 select * from 테이블명 AS OF TIMESTAMP (SYSTIMESTAMP -INTERVAL '시간' MINUTE) 해당 테이블의 10분 전 데이터를 뽑아낼 수 있는쿼리 ​ MINUTE(분) 이 아니라 SECOND(초) 나 HOUR(시간) 으로 도 조회가 가능 만능은 아니고 어느정도 시간이 지나기 전까지만 복구가 가능하며 저런식으로 잘못 삭제한 테이블의 데이터를 가져와서 ​ insert into 테이블명 select * from 테이블명 AS OF TIMESTAMP ( SYSTIMESTAMP - INTERVAL '10' MINUTE ) 이런식의 쿼리로 다시 insert가 가능하다. 혹시 delete를 잘못했을 때 간단하게 복구가능 할 수 있는 쿼리로 반드시 알아둬야할 쿼리라고 생각..
EXISTS, IN 차이점 EXISTS 같은 경우 NOT 을 사용할 경우 NULL을 포함하여 결과 도출 IN 같은 경우 NULL 을 포함하지 않고 결과를 도출한다. ​ EXISTS 든 IN 이든 원하는 결과가 나오지 않을 경우 LEFT JOIN 을 사용하여 NULL값의 여부로 결과를 뽑아내야된다. 4년전의 나는 사소한 것도 참 열심히 기록했구나...

반응형