데이터베이스
인덱스를 이용한 sort 연산 생략
인덱스 Range Scan이 가능하려면 가공하려는 컬럼의 데이터가 정렬되어 있어야 가능하다. 인덱스는 그렇기 때문에 정렬이 되어있다. 그래서 인덱스를 사용하는 이유가 있다. 테이블 생성1234create table sort_test (id char,ch_date date,ch_order varchar(10));cs 제약조건 추가1ALTER TABLE SCOTT.SORT_TEST ADD CONSTRAINT ODER_PRIMARY PRIMARY KEY (ID,CH_DATE,CH_ORDER);cs 데이터 실행계획PK를 기준으로 알아서 정렬이 되어있다. ( ID -> CH_DATE -> CH_ORDER 순서대로) 만약 별도로 order by를 sql에 지정한다고 해도 옵티마이저는 sort order by를 진행..
Mysql에서 각 유형별 상위 몇건 데이터 가져오는 방법
Mysql을 공부하면서 특정 컬럼을 그룹으로 나누고 그 그룹별로 상위 N건의 데이터를 출력하는 방법에 대해 알아보았다. MySQL은 Oracle의 그룹별로 시퀀스 번호를 할당하는 ROW_NUMBER()라는 기능이 제공되지 않아 상위 몇개의 데이터를 추출하기 위해서는 Mysql의 세션 변수를 사용하여 구현할 수 있다. 우선 두 개의 테이블이 존재한다고 가정해보자. 첫 번째 테이블은 사용자 정보를 담고 있는 user 테이블이고 두 번째 테이블은 사용자별 구매정보를 가지고 있는 purchase 테이블이 있다고 가정해보자. user 테이블 purchase 테이블 이 때 사용자 ID가 2보다 큰 사용자들을 대상으로 마지막 구매날짜가 최신인 상위 탑 7개를 추출하는 쿼리를 작성해보자. 결론부터 보여주면 다음과 같다..
Mysql @variables를 통해 변수 생성 및 대입 연산자 소개
mysql에서 사용자 정의변수로서 @variables를 사용할 수 있다. 예를 들면 다음과 같이 set 명령어를 통해 변수를 만들고 값을 부여한뒤, 해당 변수를 여러 부분에서 사용할 수 있다.12SET @a = 'test';SELECT @a;cs 해당 변수의 유효 범위는 데이터베이스와의 세션이 유효할때까지 사용이 가능하다. 그럼 변수의 데이터를 대입할때 사용하는 대입 연산자에 대해 알아보자. 대입 연산자설명=왼쪽 피연산자에 오른쪽 피연산자를 대입함. (SET 문이나 UPDATE 문의 SET 절에서만 대입연산자로 사용됨):=왼쪽 피연산자에 오른쪽 피연산자를 대입함. = 연산자는 Mysql에서 SET이나 UPDATE 문장에서 왼쪽연산자에 오른쪽 연산자를 대입하는 의미로 사용된다. 그 이외에 사용될 때는 비교..
[공유] store procedure를 사용하는 이유
스토어 프로시저를 사용하는 이유에 대해 자세히 기록된 블로그가 있어서 공유하고 나중에 확인해봐야지. http://genesis8.tistory.com/183?category=167682
파티셔닝의 정의와 종류 그리고 샤딩
샤딩과 파티셔닝 DB 보안 회사를 다니고 있고 대규모의 서비스가 기본인 현 시대에 파티셔닝과 샤딩에 대해 많이 들었지만 자세히 알지는 못했다. 이번기회에 한번 정리를 해보자. #파티셔닝 파티셔닝은 퍼포먼스, availability, maintainablity를 목적으로 논리적인 데이터를 다수의 엔티티로 분할하는 행위를 뜻한다. 대부분의 DBMS에서 지원하지만 Mysql 5.1 미만에서는 지원하지 않는다. 샤딩 또한 이 파티셔닝의 한 종류이다. 수평 파티셔닝 (horizotal partitioning, Range Based Partitioning) 샤딩과 동일한 의미를 가지며 스키마를 다수의 복제본을 구성하고 각각의 샤드에 샤드키를 기준으로 데이터를 분리하는 것을 말한다. DBA가 데이터의 패턴과 저장공간..
인덱스 Range Scan이 되기 위한 선행 조건
인덱스 Range Scan이 되기 위한 선행 조건 학교이름, 나이, 이름, 주소로 구성된 테이블이 있다고 가정해보자. 빠른 검색을 위해서 인덱스를 학교 이름, 나이, 이름으로 구성해서 만들었다고 가정해보자. CREATE INDEX SCOTT.student_idx ON SCOTT.STUDENT_TEST ("SCHOOL_NAME" ASC,"AGE" ASC,"NAME" ASC); 인덱스 구성의 순서로 인해 학교순으로 정렬하고, 나이로 정렬하고, 이름으로 정렬해서 데이터를 찾는다. 그렇기 때문에 이름을 조건으로 데이터를 검색하였을 때 결국 모든 리프노드를 다 검색해야한다. 그렇기 때문에 인덱스를 Range Scan 하기 위한 가장 첫 번째 조건은 인덱스 선두 컬럼이 조건절에 있어야한다. 그렇다면 만약 인덱스에 ..
인덱스 기본 사용법과 인덱스 스캔이 불가능한 경우 소
우리가 색인을 통해 단어를 찾는 순간을 생각해보자. ㄱ. 가나가방 장식가시 방석ㄴ.나방 나방 나무누에고치나무 장식누나 여기서 누에고치라는 단어를 찾을 때, 위에서 순차적으로 진행한다고 가정하였을 때 큰 어려움 없이 발견할 수있다. 이 방식을 Index Range Scan이라고 한다.반대로 장식이 포함된 단어를 찾아보자. 찾기 어려운 건 아니여도 모든 색인을 전부 확인해봐야한다. 이렇게 모든 색인을 다 확인하고 나서 찾을 수 있는 방식을 Index Full Scan 방식이라고 한다.그렇기 때문에 인덱스의 기준이되는 데이터 즉 컬럼을 가공하게되면 Range Scan이 불가능해진다. 정리하면 인덱스 기준이 가공되면 인덱스 스캔의 시작점을 찾는 수직적 탐색이 불가능해지기 때문이다. 몇 가지 쿼리를 예로 들어보자..
인덱스 구조 및 탐색
SQL 튜닝에서 사용되는 인덱스 인덱스 구조는 수평적 탐색과 수직적 탐색을 이룬다. 이것을 이해하고 나면 인덱스 구조에 대해 그림이 명확해진다. 인덱스를 우리가 중심적을 공부하는 이유는 SQL 튜닝에 초점이 맞쳐져있다. SQL 튜닝을 통해 원하고자 하는 데이터를 빠르게 얻기 위해서 인덱스에 대해 공부하는데 SQL을 사용하여 데이터를 찾는 방법은 이미 많이 알려진 두 가지 방식이 있다. 테이블 전체 스캔 인덱스를 이용 그럼 Table Full Scan 방식이 아닌 인덱스를 사용하기 위해 적절 한 튜닝의 핵심요소가 무엇인지 살펴보자. 만약 몸무게가 기재되어있는 학생 연명부가 있다고 가정해보자. 학생명과 몸무게로 정렬되어 있을때 학생을 찾기 위한 과정에서 학생을 찾고 몸무게 검색하는 과정이 거친다. 이런과정을..
오라클 SGA 캐시 탐색 메커니즘 정리
Direct Path I/O를 제외한 모든 블록 I/O는 메모리 버퍼캐시를 경유한다. 버퍼캐시의 구조는 해시 구조로 관리된다. 해시 함수를 통해서 나온 결과를 사용하여 해시체인(Bucket)을 찾고 그 해시체인에 연결되어 있는 버퍼 정보를 사용하여 버퍼 캐시 정보를 찾아 갈 수 있다. 만약 해시체인을 찾아주는 해시 알고리즘이 mod(x, 5)라고 할 때, 25번째 블록을 찾고 싶은 경우 해시함수를 사용해서 5로 나누고 나온 나머지 0이 해시체인 0번째를 의미한다. 그 해시체인에는 버퍼 헤더들이 들어있다. 25라는 버퍼헤더를 찾고 그 버퍼헤더가 가리키고 있는 버퍼 블록을 접근하여 데이터를 탐색하면 된다. 만약 27번째 블록을 읽으려고 해시함수를 거쳐서 2번째 해시체인에 갔으나, 버퍼 헤더 27이 없다면??..
오라클의 Table Full Scan과 Index Range Scan
테이블에 저장된 데이터를 읽는 방식은 두 가지이다. Table Full Scan은 해당 테이블에 전체 블록을 읽어서 사용자가 원하는 데이터를 찾는 방식이다. 그리고 Index Range Scan은 인덱스를 이용하여 데이터를 일정부분읽어서 ROWID로 테이블 레코드를 찾아가는 방식이다. ROWID는 테이블 레코드가 디스크 상에 어디 저장됐는지를 가리키는 위치 정보이다. 상당수의 툴(Toad, Orange)에서 데이터를 Full Scan 하는 경우에 실행계획에서 빨간색으로 경고를 보여준다. 그래서 Table Full Scan에 경우 더 느리다는 고정관념이 있으나 모두 그런것은 아니다. Index를 이용한 스캔방식이 더 느린 경우도 있다. Table Full Scan에 경우 읽고자 하는 데이터의 블록을 Mul..