본문 바로가기

DB12

[MySql] 쿼리 실행 구조 쿼리 실행 구조 쿼리 실행 구조는 기능별로 다음과 같이 나눠질 수 있다. 1. 파서(Parser) 파서는 사용자 요청으로 들어온 쿼리 문장을 토큰(MySql이 인식할 수 있는 최소 단위의 어휘나 기호)으로 분리해 트리 형태의 구조로 만들어 내는 작업을 의미한다. 이 때, 만들어진 트리 형태를 파스트리(parse tree) 라고 한다. 쿼리 문장의 문법 오류는 이 과정에서 발견되어 사용자에게 오류 메시지를 전달한다. 2. 전처리기(PreProcessor) 파서 과정에서 만들어진 파서 트리를 기반으로 쿼리 문장에 구조적인 문제점이 있는지 확인한다. 각 토큰을 테이블 이름이나 컬럼 이름 또는 내장 함수와 같은 개체를 매핑해 해당 객체의 존재 여부와 객체의 접근 권한 등을 확인하는 과정을 이 단계에서 수행한다... 2019. 6. 22.
Oracle VARCHAR2 MAX값 구하기, 마지막 레코드 구하기 seq 테이블이 VARCHAR2 타입으로 구현되어 있었다. 그럼 MAX값을 가져오고 싶은데 어떻게 가져오지? 다행히 이런 경우에도 가져오는 방법이 있기는 했다. MAX(to_number(해당 컬럼 명)) from 테이블 명 group by 그룹 아이디. 이렇게 하면 MAX인 VARCHAR2 값을 뽑을 수 있다. 그렇다면 MAX인 레코드 전체를 구하고 싶으면 어떻게 할까? Oracle에서 제일 마지막 레코드를 구하는 쿼리문 # 사용방법 SELECT * FROM (SELECT * FROM 테이블명 WHERE 조건 AND 조건 ORDER BY 필드명 DESC) WHERE ROWNUM = 1 select * from (select max(to_number(seq)), reg_dt, reg_id,content f.. 2019. 5. 27.
오라클 DUAL 테이블 Dual 테이블 오라클 자체에서 제공되는 테이블 간단하게 함수를 이용해서 계산 결과값을 확인 할 때 사용하는 테이블 사용용도 사용자가 함수(계산)를 실행할 때 임시로 사용하는데 적합하다. 함수에 대한 쓰임을 알고 싶을 때 특정 테이블을 생성할 필요없이 dual 테이블을 이용해 함수의 값을 리턴 받을 수 있다. ex) SELECT 시퀀스.NEXTVAL FROM DUAL; SELECT SYSDATE FROM DUAL; SELECT CURRENT_DATE FROM DUAL; MERGE into 내부에서 사용 2019. 5. 14.
오라클 시퀀스 사용법(NEXTVAL, CURRVAL) 시퀀스 생성 CREATE SEQUENCE [시퀀스 이름] [START WITH 시작번호] - default 1 [INCREMENT BY 증가단위] - default 1 [MAXVALUE 최대값] - default 오라클 버전 최대값 [MINVALUE 최소값] - default 1 [CYCLE | NOCYCLE] [CACHE | NOCACHE] - default 20 이름 빼고는 생략가능 cycle - 시퀀스가 최대 값이 되었을 때 다시 시작값으로 돌아갈 것인지 cache - 시퀀스 값을 메모리에 할당할 것인지 시퀀스 수정 ALTER SEQUENCE [시퀀스 이름] START WITH는 수정 불가능 시퀀스 검색 `SELECT * FROM USER_SEQUENCES`; 이 쿼리를 사용하면 생성된 모든 시퀀스.. 2019. 5. 14.
[MySql] 실행계획 MySql 실행 계획 DBMS의 쿼리가 실행되면 결과를 출력하는 방법은 아주 많이 있지만, 그 중에서 최적화된 방법을 결정해야 한다. DBMS에서는 쿼리를 최적으로 실행하기 위해 각 테이블의 데이터가 어떤 분포로 저장돼 있는지 통계 정보를 참조하고, 그 기본 데이터를 비교해 최적의 실행 계획을 수립하는 작업이 필요하다. 이런 역할을 하는 것이 DBMS의 옵티마이저다. 모든 DBMS의 옵티마이저는 가장 복잡하고, 이해하기 어렵다. 하지만 실행 계획을 이해할 수 있어야 불합리한 부분을 찾아내, 더욱 최적화된 방법으로 계획을 수립하도록 유도할 수 있다. 쿼리 실행 절차 크게 3가지로 나눌 수 있다. 사용자로부터 요청된 SQL 문장을 잘게 쪼개서 MySql 서버가 이해할 수 있는 수준으로 분리 SQL의 파싱 정.. 2019. 5. 4.
[MySql] Procedure로 loop insert DB에서 대량의 대상들에 대해 테스트를 해보기 위해 임시의 데이터를 넣어야한다. 그런데 어떻게 그 많은 데이터들을 다 넣을까? 프로시저를 사용해서 데이터를 insert 해준다. delimiter $$ DROP PROCEDURE IF EXISTS dataBulkInsert$$ create procedure dataBulkInsert() //함수 생성 begin //시작 declare i int default 1; //i값 생성 while(i 100; end loop; end; call dataInsert(); 2019. 3. 21.