오라클 union 쿼리쓸때 유의점

Posted by HULIA(휴리아)
2020. 6. 29. 15:57 백엔드개발/데이터베이스

1)ORA-01789 : 질의 블록은 부정확한 수의 결과 열을 가지고 있습니다

유니온되는 쿼리의 결과값들이 열이 맞지 않을때 발생
즉 쿼리의 결과 옆을 맞춰주면 해결

2)ORA-00933: 명령어가 올바르게 종료되지 않았습니다

order by 절이 가장 마지막에 있어야 하는데 중간에 있을때 발생
즉 order by절은 union쿼리의 가장 마지막에 있으면 해결

스칼라 서브쿼리 인라인뷰 서브쿼리

Posted by HULIA(휴리아)
2019. 11. 2. 23:52 백엔드개발/데이터베이스

쿼리에서

SELECT 문안에 SELECT 문이 들어갈 수 있는 세곳입니다

1)SELECT 절

2)FROM 절

3)WHERE 절

 

각각의 SELECT절을 지칭하는 명칭이 다릅니다

1)SELECT 문에 SELECT절을 스칼라 서브쿼리라고 합니다

2)SELECT 문에 FROM절 안에 들어가는 SELECT절을 인라인 뷰라고 합니다

3)SELECT 문에 WHERE절 안에 들어가는 SELECT절을 서브쿼리라고 합니다

 

그리고 주의점도 있습니다

1)스칼라 서브쿼리

하나의 레코드만 출력이 가능(두개 이상의 레코드일때는 사용할 수 없음)

일치하는 데이터가 없더라도 NULL값을 출력 가능

성능상 좋지 않기 때문에 사용하지 않는게 좋지만 단순히 코드에 따른 코드명출력할때는 사용하는게 좋을 수 있습니다

 

2)인라인 뷰

일종의 테이블이기 때문에 조인조건을 줄 수 있습니다

그래서 별칭을 주어야 하고 인라인뷰의 컬럼명도 별칭을 주어서 연결을 잘 시켜줘야 합니다

 

3)서브쿼리

기본적으로 단일행 서브쿼리가 있지만

IN, ANY, ALL과 결합되어서 아래와 같은 서브쿼리가 생기기도 합니다~

3.1)다중행 서브쿼리

3.2)다중컬럼 서브쿼리

 

 

Mysql 컬럼의 줄바꿈, 공백, 캐리지리턴 tab 제거하고 select하기

Posted by HULIA(휴리아)
2019. 3. 10. 23:29 백엔드개발/데이터베이스

1. 라인피드 제거하고 select하기

select replace(컬럼명, char(10), '') from 테이블명;


2. 캐리지리턴 제거하고 select하기

select replace(컬럼명, char(13), '') from 테이블명;


3. tab 제거하고 select하기

select replace(컬럼명, char(9), '') from 테이블명;


4. 개행문자 제거하고 select하기

select replace(컬럼명, '\r\n', '') from 테이블명;


5. 하이픈(-) 제거하고 select하기

select replace(컬럼명, '-', '') from 테이블명;


6. 공백 제거하고 select하기

select replace(컬럼명, ' ', '') from 테이블명;

MYSQL DDL 쿼리 CREATE ALTER

Posted by HULIA(휴리아)
2018. 12. 16. 21:06 백엔드개발/데이터베이스

CREATE TABLE `BANK_SMS_PARSING` (

  `ID` int(11) NOT NULL AUTO_INCREMENT,

  `BANK_NAME` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL,

  `SMS_ADDRESS` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL,

  `DELIMITER` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL,

  `LEN_ACCOUNTNUM` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL,

  `POS_DATE` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL,

  `POS_ACCOUNTNUM` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL,

  `POS_PRICE` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL,

  PRIMARY KEY (`ID`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;




ALTER TABLE `easywhooing`.`CARD_SMS_PARSING` 

CHANGE COLUMN `ID` `ID` INT(11) NOT NULL AUTO_INCREMENT ;

차집합 쿼리 만드는 방법

Posted by HULIA(휴리아)
2018. 11. 14. 18:08 백엔드개발/데이터베이스
SELECT
FROM
A서브쿼리
LEFT JOIN
B서브쿼리
ON절
WHERE절 A.ID IS NULL 이나 B.ID IS NULL로 하면 된다
즉 둘중에 NULL유무로 차집합을 출력한다

앱)null이 0으로 리턴되는 쿼리 mybatis

Posted by HULIA(휴리아)
2018. 11. 13. 18:10 백엔드개발/데이터베이스
<select parameterType="map" resultType="Integer">
SELECT IFNULL((SELECT IFNULL(CNT, 0) FROM TABLE), 0)
</select>

앱)특정 컬럼에 따라 Count하는 쿼리 mybatis dao

Posted by HULIA(휴리아)
2018. 11. 1. 16:39 백엔드개발/데이터베이스
<select id="xxx" parmeterType="map" resultType="hashmap">
SELECT
CAST(COUNT(CASE WHEN ABC.YN ='N' THEN 1 END) AS CHAR)AS N_CNT
,CAST(COUNT(CASE WHEN ABC.YN='Y' THEN 1 END) AS CHAR) AS Y_CNT
FROM ABC AS ABC;
</select>


public HashMap<String, String> getCount(){
Map<String, String> paramMap = new HashMap<String, String>();
paramMap.put("key","value");
      return sqlSessionTemplate.selectOne("xxx", paramMap);
}

앱)아는만큼 보이는 데이터베이스 설계과 구축 요약3

Posted by HULIA(휴리아)
2018. 10. 29. 14:37 백엔드개발/데이터베이스
16 성능 데이터 모델링
데이터 모델의 성능이 저하되는 원인
-데이터 모델구조
-데이터가 대용량
-인덱스 특성을 고려 못함

성능 데이터 모델을 수행하는 방법의 단계
첫째, 정규화를 정확하게 수행
둘째, 데이터베이스 용량 산정을 수행한다
셋째, 데이터베이스에 발생하는 트랜잭션의 유형을 파악한다
넷째, 용량과 트랜잭션의 유형에 따라 반정규화를 수행한다.
다섯째, 이력모델 조정, PK/FK 조정, 수퍼타입/서브타입 조정 등을 수행한다
여섯째, 데이터 모델을 검증한다

17 정규화를 통한 데이터베이스 성능 향상
정규화 수행과 성능의 관계
정규화 수행 -> 조회 기능 -> 성능이 향상되거나 저하될 수 있음
정규화 수행 -> 입력수정삭제기능 ->성능이 향상됨

18 반정규화를 통한 데이터베이스 성능 향상
반정규화는 비정규화, 역정규화라고 함
반은 반대하다의미이다

반정규화란 시스템의 성능 향상과 개발 및 운영의 단순화를 위해 정규화된 엔티티타입, 속성, 관계에 대해 중복, 통합, 분리 등을 수행하는 데이터 모델링 기법을 의미한다
좁은 의미의 반정규화는 데이터 중복하여 성능을 향상시키는 기법을 의미하며
더 넓은 의미의 반정규화는 성능을 향상시키기 위해 정규화된 데이터 모델에서 중복, 통합, 분리 등을 수행하는 모든 과정을 의미한다
반정규화를 적용할때는 데이터 무결성이 깨질 가능성이 많기 때문에 반드시 데이터 무결성을 보장할 수 있는 방법을 고려한 이후에 적용해야 한다

반정규화를 적용의 단계
첫째, 반정규화의 대상을 조사
전체 데이터양을 조사하고 그 데이터가 해당 프로세스를 처리할 때 성능 저하가 나타날 것인지 검증해야 한다
데이터가 대량이고 성능이 저하될 것으로 예상될때 다음 네가지 경우 중 하나에 해당하면 반정규화를 고려
-자주 사용되는 테이블에 접근하는 프로세스의 수가 많고 항상 일정한 범위만을 조회하는 경우
-테이블에 대량의 데이터가 있고 대량의 데이터 범위를 자주 처리하는 경우에 처리범위를 일정하게 줄이지 않으면 성능을 보장할 수 없는 경우
-통계성 프로세스에 의해 통계 정보를 필요로 하는 경우(이때는 반정규화된 별도의 통계 테이블을 생성한다)
-테이블에 지나치게 많은 조인이 걸려 데이터를 조회하는 작업이 기술적으로 어려울 경우

둘째, 반정규화의 대상에 대해 다른 방법으로 처리할 수 있는지 검토
-지나치게 많은 조인이 걸려 데이터를 조회하는 작업이 기술적으로 어려울 경우 뷰를 사용하면 이를 해결할수도 있다
뷰가 조회 성능을 향상시키는 역할을 수행하지는 않는다. 다만 개발자별로 SQL문장을 만드는 방법에 따라 성능 저하가 나타날 수 있으므로 성능을 고려한 뷰를 생성하여 개발자가 뷰를 통해 접근하게 함으로써 성능 저하의 위험을 예방하는 것도 좋은 방법이 된다.
-대량의 데이터 처리나 부분 처리에 의해 성능이 저하되는 경우 클러스터링을 적용하거나 인덱스를 조정함으로써 성능을 향상시킬 수 있다.
클러스터링을 적용하는 방법은 대량의 데이터를 특정 클러스터링 팩트에 의해 저장 방식을 다르게 하는 방법이다
이 방법은 데이터 입력/수정/삭제할때 성능이 많이 저하되므로 조회 중심의 테이블이 아니라면 생성하면 안되는 오브젝트이다
다만 조회가 대부분이고 인덱스를 통해 성능 향상이 불가능하다면 클러스터링을 고려할 만하다
인덱스를 통해 성능을 충분히 확보할 수 있다면 인덱스를 조정하여 반정규화를 회피하도록 한다
-대량의 데이터는 PK의 성격에 따라 부분적인 테이블로 분리할 수 있다
즉 파티셔닝 기법의 적용으로 성능 저하를 방지할 수 있다
인위적인 테이블을 통합/분리하지 않고 물리적인 저장기법에 따라 성능을 향상시키는 파티셔닝을 고려해 볼 수 있다
이 경우는 데이터가 특정기준(파티셔닝 키)에 의해 다르게 저장되고 파티셔닝 키에 따른 조회가 될때 성능이 좋아지는 특성이 있다.
따라서 특정 기준에 의해 물리적인 저장 공간이 구분될 수 있고 트랜잭션이 일정한 기준에 의해 들어온다면 파티셔닝 테이블을 적용하여 조회 성능을 향상시키는 것도 좋은 방법이 될 수 있다.
-응용 애플리케이션에서 로직을 구사하는 방법을 변경함으로써 성능을 향상시킬수 있다.
응용 메모리 영역에 데이터를 처리하기 위한 값을 캐쉬하거나 중간 클래스 영역에 데이터를 캐쉬하여 공유하게 하는 것도 성능을 향상시키는 방법이 될 수 있다.

셋째, 다른 방법이 없다면 반 정규화를 적용한다.

반정규화의 기법들
테이블관련 반정규화 방법
테이블 병합 기법
1)1:1관계 테이블 병합 -> 1:1관계를 통합하여 성능 향상
2)1:M관계 테이블 병함 -> 1:M관계를 통합하여 성능 향상
3)수퍼/서브타입 테이블 병합 -> 수퍼/서브 관계 통합하여 성능 향상

테이블 분할 기법
1)수직 분할 - 컬럼단위의 테이블을 디스크 I/O를 분산 처리하기 위해 테이블 1:1로 분리하여 성능 향상(트랜잭션이 처리되는 유형 파악이 선행되어야 함)
2)수평 분할 - 로우 단위로 집중 발생하는 트랜잭션을 디스크 I/O 및 데이터 접근의 효율성을 높여 성능을 향상시키기 위해 로우 단위로 테이블을 쪼깸(관계가 없음)

테이블 추가 기법
1)중복 테이블 추가 - 다른 업무이거나 서버가 다른 경우 동일한 테이블 구조를 중복하여 원격 조인을 제거하여 성능 향상
2)통계 테이블 추가 - SUM, AVG등을 미리 수행하여 계산해 둠으로써 조회 성능 향상
3)이력 테이블 추가 - 이력 테이블 중에서 마스터 테이블에 존재하는 레코드를 중복하여 이력 테이블에 존재하는 방법은 반정규화의 유형
4)부분 테이블 추가 - 하나의 테이블의 전체 컬럼 중 자주 이용하는데 자주 이용하는 집중화된 컬럼들이 있을 때 디스크 I/O를 줄이기 위해 해당 컬럼들을 모아놓은 별도의 반정규화된 테이블을 생성

컬럼관련 반정규화 방법
1)중복 컬럼 추가 - 조인에 의해 처리할 때 성능 저하를 예방하기 위해 즉 조인을 감소시키기 위해 중복된 컬럼을 위치시킴
2)파생 컬럼 추가 - 트랜잭션이 처리되는 시점에 계산에 의해 발생되는 성능 저하를 예방하기 위해 미리 값을 계산하여 컬럼에 보관함(Derived Column이라고 함)
3)이력 테이블 컬럼 추가 - 대량의 이력 데이터를 처리할 때 불특정 날 조회나 최근 값을 조회할 때 나타날 수 있는 성능 저하를 예방하기 위해 이력 테이블에 기능성 컬럼(최근값 여부, 시작과 종료일자 등)을 추가함
4)PK에 의한 컬럼 추가 - 복합 의미를 갖는 PK를 단일 속성으로 구성하였을 경우 발생이 됨. 단일 PK 안에서 특정값을 별도로 조회하는 경우 성능 저하가 발생될 수 있음. 이때 이미 PK안에 데이터가 존재하지만 성능 향상을 위해 일반 속성으로 포함하는 방법이 PK에 의한 컬럼 추가 반정규화임
5)응용 시스템 오작동을 위한 컬럼 추가 - 업무적으로 의미가 없지만 사용자가 데이터 처리를 하다가 잘못 처리하여 원래 값으로 복귀하기를 원하는 경우 이전 데이터를 임시적으로 중복하여 보관하는 방법. 컬럼으로 이것을 보관하는 방법은 오작동 처리를 위한 임시적인 기법이지만 이것을 이력 데이터 모델로 풀어내면 정상적인 데이터 모델의 기법이 될 수 있음

관계관련 반정규화 방법
1)중복관계 추가 - 데이터를 처리하기 위한 여러경로를 거쳐 조인이 가능하지만 이때 발생할 수 있는 성능 저하를 예방하기 위해 추가적인 관계를 맺는 방법

20 데이블 수직/수평 분할에 의한 성능 향상
트랜잭션의 집중 -> 수평분할/수직분할
대량의 데이터가 존재하는 테이블에 많은 트랜잭션이 발생하여 성능이 저하되는 구조의 테이블을 수평/수직분할 설계하면 성능 저하를 예방할 수 있다

수평분할 : 컬럼단위로 분할하여 I/O 경감
수직분할 : 로우단위로 분할하여 I/O 경감

테이블의 많은 양의 데이터가 예상될 경우 파티셔닝을 적용하거나 PK에 의해 테이블을 분할하는 방법을 적용할 수 있다
Rage partition적용(가장 많이 사용하는 파티셔닝의 기준)
요금일자+요금번호->요금일자의 년+월을 이용하여 12개의 파티션 테이블을 만들었음

List partition적용
지점, 사업소, 사업장, 핵심적인 코드값으 로 PK가 구성되어 있고 대량의 데이터가 있는 테이블이라면 적용할 수 있다.
List partition은 대용량 데이터를 특정값에 따라 분리 저장할 수 있으나 range partition과 같이 데이터 보관주기에 따라 쉽게 삭제하는 기능은 제공하지 않는다.

테이블을 수평분할할 것인지, 수직분할할 것인지 정하려면 두가지를 적용하면 된다
첫째, 데이터 모델링을 완성한다
둘째, 데이터베이스 용량 산정을 한다


21 수퍼타입/서브타입 모델의 성능 고려방법
Extended ER 모델이라고 불리우는 이른바 수퍼/서브 타입 데이터 모델은 최근 데이터 모델링을 할때  매우 자주 쓰이는 모델이다
이 모델이 자주 쓰이는 것은 업무를 구성하는 데이터의 특징을 공통점과 차이점을 고려하여 효과적으로 표현할 수 있기 때문
즉, 공통의 부분을 수퍼타입으로 모델링하고 공통으로부터 상속받아 다른 엔티티타입과 차이가 있는 속성에 대해서는 별도의 서브 엔티티타입으로 구분하여 업무의 모습을 정확하게 표현하면서 물리적인 데이터 모델로 변환을 할 때 선택의 폭을 넓힐 수 있다는 장점이 있다.

수퍼/서브 타입의 데이터 모델은 논리적인 데이터 모델에서 이용되는 형태이다

22 인덱스 특성을 고려한 PK/FK 데이터베이스 성능 향상
데이터 조회가 가장 효과적으로 처리될 수 있도록 접근 경로를 제공하는 오브젝트가 바로 인덱스이다
PK/FK컬럼 순서는 간단해 보이지만 실전프로젝트에서 아주 중요하다

물리적인 테이블에  FK를 사용하지 않아도 데이터 모델 관계에 의해 상속받은 FK속성들은 SQL Where 절에서 조인으로 이용되는 경우가 많이 있다.
따라서 FK 인덱스를 생성해야 성능이 좋은 경우가 많다.
그러므로 물리적인 테이블에 FK 제약을 걸었을 때는 반드시 FK 인덱스를 생성하도록 해야 한다.


23 효율적인 채번 방식을 통한 성능 향상
업무적으로 의미있는 식별자와 일련번호 형식의 시스템적 식별자에는 장단점이 존재

채번의 방법
-채번 테이블을 이용하여 일련번호를 증가시키는 방법 -> 채번구분컬럼, 채번컬럼
장:중복에러 없음, 순차적 데이터 입력 가능
단:잠금 현상 유발, 성능저하, 관리 항목 증가

-해당 테이블에 일련번호에 최대값+1을 바로 가져오면서 입력하는 방법 -> max(번호+1)
장:빠른 성능, 순차적 데이터 입력 가능, 관리항목 증가 없음
단:중복 에러 가능

-DBMS에서 제공하는 일련번호 증가 오브젝트(오라클의 시퀀스 오브젝트)를 이용하여 처리하는 방법
장:빠른 성능, 중복에러 없음, 잠금 현상 없음
단:순차적 데이터 입력 불가능, 관리 항목 증가

해당 테이블에 최대값을 처리하는 방법이 가장 권할 만하다 + PK중복 안되게 설계
예를 들어 구분자에 지역구분코드, 사업소구분코드, 업무구분코드 등을 포함하여 데이터 입력시 이코드에 따라 채번할 수 있게 하면 중복에러가 거의 발생하지 않게 되는 것

24 FK를 이용할 것인가?
FK를 생성하지 않을 때 발생하는 문제는 한가지 뿐이다
데이터의 참조 무결성이 깨지는 것이다

나중에 FK를 반영할때는 다음의 단계를 거쳐야 한다
1단계 데이터 베이스에 FK 제약 조건 생성
2단계 데이터 전환을 수행할 때 데이터의 문제점 검증(null값, 기존에 입력된 값의 FK규칙 만족성)
3단계 참조무결성으로 인해 입력되지 않은 데이터를 수정하여 전환
4단계 프로그램에 데이터 입력/수정/삭제 검증(에러가 발생하는 프로그램들을 추출하여 데이터 처리의 순서 등을 조정해야 함)
5단계 프로그램에서 데이터처리 성능 검증


25 데이터베이스 분산 설계를 활용
분산데이터의 정의
-여러곳으로 분산되어 있는 데이터베이스를 하나의 가상 시스템으로 사용할 수 있도록 한 데이터베이스
-논리적으로 동일한 시스템에 속하지만, 컴퓨터 네트워크를 통해 물리적으로 분산되어 있는 데이터들의 모임, 물리적 site분산, 논리적으로 사용자 통합 및 공유

분산데이터베이스가 되기 위한 6가지 투명성
-분할 투명성(단편화):하나의 논리적 relation이 여러 단편으로 분할되어 각 단편의 사본이 여러 site에 저장
-위치 투명성:사용하려는 DATA의 저장 장소 명시 불필요. 위치정보가 system catalog에 유지되어야 함
-지역사상 투명성:지역 DBMS의 물리적 DB 사이의 Mapping 보장, 각 지역시스템 이름과 무관한 이름 사용 가능
-중복 투명성:DB객체가 여러 site에 중복되어 있는지 알 필요가 없는 성질
-장애 투명성:구성요소(DBMS, computer)의 장애에 무관한 transaction의 원자성 유지
-병행 투명성:다수 transaction 동시 수행시 결과의 일관성 유지, timestamp, 분산2단계 locking을 이용하여 구현

분산 설계의 방법
-테이블의 복제
-분할 분산

분산환경에서의 데이터 동기화
-트랜잭션의 동기화
-배치작업 처리
-DBMS 기능 활용

언제 적용하면 효과적일까?
성능이 중요한 사이트에 적용해야 한다
공통코드, 기준 정보, 마스터 데이터 등에 대해 분산환경을 구성하면 성능이 좋아진다.
또한 실시간 동기화가 요구되지 않을때 좋다.
거의 실시간의 업무적인 특징을 가지고 있을때도 분산환경을 구성할 수 있다.
특정 서버에 부하가 집중이 될때 부하를 분산시키는 목적으로도 좋다
백업사이트(Disaster Recovery Site)를 구성할때도 간단하게 분산 기능을 적용하여 구성할 수 있다

26 데이터베이스 진단의 핵심 원리
설계단계의 진단
1) 데이터베이스 설계 - 물리적 데이터 모델, 데이터 무결성, 오브젝트설계, 테이블스페이스 설계, 데이터베이스 환경(파라미터설계), 가용성 설계
데이터 무결성을 유지할 수 있도록 비즈니스 규칙에 따른 참조 무결성 졔약 조건, 체크값, 디폴트 값들이 적절한지 진단함
오브젝트의 크기 및 성능을 고려한 인덱스의 설계 등을 진단함
세션의 수, 사용자 수, 메모리 사용량, 업무 증가량 등을 고려하여 데이터베이스 파라미터를 설계하였는지 진단

2) 표준 설계 - 명명규칙 설계,  SQL 작성 규칙 설계
데이터베이스 오브젝트(테이블, 테이블스페이스, 데이터파일, 인덱스, 뷰, 시퀀스, 컬럼명 등)에 대한 명명규칙이 존재하는지 진단
SQL 문장 작성에 대한 규칙은 존재하는지, SQL 문장에 대한 작성 규칙은 성능을 고려하여 반영되어 있는지 진단
개발자에게 SQL 튜닝, SQL 작성 가이드를 교육하였는지를 진단

3) 데이터 전환 - 현행 데이터 분석, 데이터 전환 계획서
전환 설계에는 데이터양, 전환 절차 및 방법, 데이터 검증 절차 및 방법, 테스트 일정이 포함되어 있는지 진단

4) 데이터베이스 운영 관리 - DB 변경 관리절차, DB 성능관리 절차, 백업/복구 절차
운영환경의 DB변경 절차가 있는지, 변경 절차에 관리자의 합의/검토/조정이 포함되었는지 진단
고객의 성능에 대한 요구 사항을 도출하였는지, 적절한 성능 모니터링 방안/툴이 있는지 진단
인덱스 생성/변경/삭제의 영향 분석을 위한 방안이 있는지 진단
DB 장애/백업/복구에 대한 고객의 요구 사항을 도출하였는지 진단

5) 분산 설계 - 분산 구조, 분산 구조에 따른 모델
업무별, 지역별, 서버별 프로세스 데이터 모델의 트랜잭션이 분석되었는지 업무별, 지역별, 서버별 분산 환경에 따라 트랜잭션을 고려한 분산 데이터 모델이 작성되었는지 진단함

6) 데이터베이스 보안 설계 - 데이터베이스 보안 정책, 접근 제어 설계, 암호화 필드
DB개발자 계정과 관리자 계정은 분리하여 관리하는지 진단
패스워드 컬럼에 대한 암호화 규칙은 설계되어 있는지 진단
DBMS의 기본계정(sys, system)에 대한 패스워드는 변경되어 있는지 진단

구축단계의 진단
1) 데이터베이스 성능 - 애플리케이션 성능, 데이터베이스 구조 성능
수행 애플리케이션에 대한 성능이력을 관리하는지 진단(성능 모니터링에 의거한 지속적인 튜닝작업을 하고 있는지, 성능 점검 프로세스를 준수하고 있는지 진단)
애플리케이션성능 기준을 설정하였는지, 운영 환경 데이터베이스에 실제 환경과 유사한 테스트 데이터가 입력되어 있는지 진단함
데이터베이스 메모리의 크기를 업무, 데이터양, 시스템의 물리 메모리를 고려해 산정하였는지 진단
데이터베이스의 동시 세션수, 세션 메모리, 세션 연결 방법에 대해 적절히 산정하였는지 진단
트랜잭션양을 고려해서 redo log의 크기를 산정하였는지 진단
인스턴스 복구 시간과 성능을 고려한 체크포인트 발생 주기를 설정하였는지 진단
데이터 정렬을 위한 메모리 크기는 적절한지를 진단

2) DB 오브젝트 관리 - 인덱스 추가 설계, 명명규칙
3) 데이터 전환
4) 데이터베이스 운영 관리, 변경 관리, 백업/복구, 운영 환경 준비
컨트롤 파일과 redo log에 대한 미러링이 되어 있는지 진단
운영자 가이드 작성을 위한 준비가 되어 있는지 진단

시스템 운영시점의 진단
1) 데이터베이스 구성 - 오브젝트, 테이블 스페이스, 이중화/분산 구성
인덱스의 데이터 분포도는 인덱스 효율을 보장할 수 있는지 진단
대용량 테이블은 적절한 방법으로 파티셔닝 되어 있는지 진단
VIEW, LOB, PL/SQL은 성능 고려하여 적절하게 구현되어 있는지 진단
테이블과 인덱스의 테이블스페이스를 분리하였는지 진단
트랜잭션양을 고려하여 redo log 크기를 산정하였는지 진단
데이터베이스 클러스터링(HA, RAC)에 대한 구성은 적합한지 진단

2) 데이터베이스 성능 - SQL 성능, 데이터베이스 구조 성능
3) 데이터베이스 관리 - 변경관리, 인시던트/문제관리, 데이터관리, 용량 관리
변경 실행전 원상복구 방안이 준비되고 충분한 테스트가 이루어지고 있는지 진단
장애 시나리오별 대응 방안이 수립되어 있는지, 이를 바탕으로 장애처리 하고 있는지, 장애 시나리오별 가용성 테스트를 주기적으로 수행하고 있는지 진단
version upgrade 및 patch 적용이 적절히 이루어지고 있는지 진단
테이블 및 인덱스에 대한 reoranization작업은 주기적으로 적절하게 수행되고 있는지 진단
데이터 보관주기에 따라 데이터 purge작업이 주기적으로 적절하게 이루어지고 있는지 진단

4) 데이터 품질
PK, FK, CK등 데이터 정합성이 유지되고 있는지 진단
비즈니스적 데이터 오류, 사용자의 데이터 입력 오류가 사전에 차단되고 있는지 진단

앱)조인 쿼리 튜닝

Posted by HULIA(휴리아)
2018. 10. 29. 11:10 백엔드개발/데이터베이스
조인을 할때
각각 테이블에 ON절에 조인조건을 쓰게 되어 있음
보통의 개발자는 각각 테이블이 조인되는 ON절과 조인이 된 후의 WHERE절의 조건을 혼용해서 쓰게 되어서 어떨때는 쿼리의 성능이 많이 떨어질 경우가 있음
게다가 INNER JOIN을 할 경우 ON절을 쓰지 않고 WHERE절에 ON절의 내용을 쓰는 경우가 종종 있음

조인튜닝을 할때
1)ON절을 반드시 쓰도록 함
2)ON절에 해당 테이블과의 조인될때 필요한 조인조건과 연산되어야 하는 조건을 모두 써줌
EX)A와 B테이블의 조인한다면
ON절에 A테이블.조인컬럼 = B테이블.조인컬럼 이것도 써줘야 하지만 A테이블.DEL_FG = 'N' 이나 B테이블.DEL_FG = 'N' 등과 같은 WHERE절 써줘야 할것도 해당 조인시에는 ON절에 모두 기록함
3)조인쿼리의 WHERE절에는 모든 테이블과 조인이 된 후에 필터링할 조건을 써줘야 함

이렇게만 해도 조인 성능이 많이 올라감
왜냐면 조인쿼리에는 1)ON절이 실행 2)WHERE절이 실행 되기 때문임

이코리아텍 실습과 함께하는 데이터베이스 MYSQL 강의 정리3/3

Posted by HULIA(휴리아)
2018. 10. 9. 00:12 백엔드개발/데이터베이스

파티셔닝/샤딩이 필요한 이유

1)인덱스를 아무리관리해도 검색속도 관리가 안된다

2)하나의 시스템에서 일정부분의 저장공간을 초과하는 경우(예를 들어 20테라를 초과)

---->주로 WRITE 성능을 높이기 위해 사용



VLDB(Very Large DBMS) = 데이터들을 여러개의 시스템에 저장하는 방식

전체DB가 하나의 DBMS시스템에 다 들어가기 힘들어지는 경우(수억개, 수십억개가 넘어가게 되면)

-테이블 들을 여러개의 군으로 나눠 분산저장

-하나의 테이블이 방대한 경우에는 사전방식(a-m, n-r, s-z)와 같이 나눠 저장



파티셔닝

:DBMS 레벨 분할



샤딩(Sharding)

:DBMS 외부에서 분할(시스템이 분할됨) / 응용레벨에서 구별해야 함

:별도의 시스템이 필요하다



파티셔닝/샤딩 제약사항

-테이블 단위 연산이 힘들어짐(비용문제)

조인연산 어려움 -> 정규화(normallization)문제

역정규화(denormalization) -> 중복허용으로 해결


-외래키의 효용문제

레코드 추가시 참조무결성 조건 체크 -> 시스템 부담증가로 수동전환

CRUD시 위치를 인식해야 함(어디 위치에 저장했는지 확인해야함)



파티셔닝/샤딩 이점

-데이터 전체 검색 시 필요한 부분만 탐색해 성능 증가

-전체 데이터를 손실할 가능성이 줄어듦 -> 가용성(availabiltity) 향상

-파티션별 백업/복구 가능

-파티션 단위로 I/O 분산가능 -> 업데이트 성능 증가



파티셔닝/샤딩 방식

-범위(range) a-m / n-r / s-z

-해시(hash) 해시함수 파티션별로 크기를 비슷하게 나눔

-리스트(list) 특정한 컬럼을 기준(연도별)

-컴포지트(composite) - range-hash / range-list


MYSQL 파티셔닝

-MYSQL 5.x에서 지원

-최대 파티션은 1024개

-모든 파티션은 동일 스토리지 엔진사용 해야함

-파티션은 외래키 / Full Text 인덱스 지원하지 않음

-파티션 값은 정수


예제)

BusinessCard 테이블에 연도 컬럼을 추가하면서 생성하면서 파티셔닝하시오

Create table BusinessCard (ID INT NOT NULL, Name varchar(255), Address varchar(255). Telephone varchar(255), CreationTime Date)

PARTITION BY RANGE (YEAR(CreationTime))

(

   PARTITION p0 VALUES LESS THAN (2015),

   PARTITION p1 VALUES LESS THAN (2016),

   PARTITION p2 VALUES LESS THAN (2017),

   PARTITION p3 VALUES LESS THAN MAXVALUE

);


예제)

파티셔닝을 새로 추가

ALTER TABLE BusinessCard ADD PARTITION (PARATITION p4 VALUES LESS THAN(2005));


예제)

파티셔닝을 삭제

ALTER TABLE BusinessCard DROP PARTITION p4;


예제)

파티션 분할

ALTER TABLE BusinessCard REORGANIZE PARTITION p3 INTO (

   PARTITION p3 VALUES LESS THAN (2015),

   PARTITION p4 VALUES LESS THAN MAXVALUE

);


예제)

파티션 병합

ALTER TABLE  BusinessCard REORGANIZE PARTITION p2, p3 INTO (

   PARTITION p23 VALUES LESS THAN (2014)

);





데이터베이스 복제(Replication)

-데이터베이스의 내용을 복제해 동일한 DB내용을 유지

-두개 이상의 DBMS시스템을 마스터/슬레이브로 나눠 마스터DBMS->슬레이브DBMS로 SQL 쿼리 복제(SELECT 제외)

데이터 업데이트(CUD)는 마스터에서

읽기(R)은 슬레이브에서

-웹서버 시스템 성능확장에 적합

-주로 읽기 성능을 높이기 위해 사용




복제 방식

-로그기반 복제(Binary Log)

  Statement Based - SQL문장복제, SQL에 따라 결과가 달라지는 경우(시간, UUID, ...)  / 단 시간이나 id가 다를 수 있는 문제발생소지 있음 / 복제할 데이터양이 작음

  Row Based - SQL에 따라 변경된 라인만 기록하는 방식 / 데이터가 많이 변경된 경우 데이터 커지는 문제발생소지 있음 / 정확한 데이터를 복제가능함

  Mixed - 두 방식 복합


Mysql 복제 쉽게 지원함

-두개의 mysql서버 필요

-물리적 두개의 서버 혹은 가상화 시스템에서도 가능







전문검색(Full Text Search)의 필요성

:기존의 Like 검색의 단점을 개선하기 위함(like 여러개의 조건문을 And/or로 like 검색을 할 경우 심각한 성능 저하됨을 개선하기 위한 검색)

:결과는 동일하지만 DB서버에 부담을 주지 않는 방식



전문검색(Full Text Search)

-기본적으로 컬럼 내용 전체를 단순 문자열(Plain Text)로 생각하고 검색하는 방식(스키마를 무시하고 검색)

-문서편집기의 편집 찾기/바꾸기 메뉴의 동작방식과 유사


Mysql의 Full Text Search방식

-자연어 검색

-불린 검색(조건절 검색)

-쿼리 확장 검색


Full Text Search용 인덱스 생성

ALTER TABLE 테이블명 ADD FULLTEXT(컬럼명);


Full Text Search 설정

my.ini(my.cnf)파일에서

ft_min_word_len= 2

2자 이상의 단어에 대해서 적용하도록 제한(기본값은 4)


기존 full text search가 있었으면 인덱스 재구성 해야함(업데이트 적용)

REPAIR TABLE 테이블명 QUICK;


예시)

자연어검색

where match(컬럼명) against('검색어/검색문장');

결과는 검색의 정확도에 대한 내림차순 정렬


예시)

불린검색

검색의 정확도에 따른 정렬이 안되고 연산자 사용한 구문 검색 가능

필수단어(+), 예외단어(-), 부분단어(*)

where match(컬럼명) against('단어*' -제외단어 in boolean mode);







Bulk Insert(여러개의 건을 insert할때)

INSERT의 경우 레코드를 추가한 후 내부적으로 인덱스 재구성을 실행함

그런데 여러개의 건을 Insert할때마다 인덱스 재구성하니 오버헤드 발생

각각의 insert마다 인덱스를 재구성하는 것이 아니라

마지막에 한번 인덱스 재구성하는 것을 Bulk Insert라고 함



인덱스 작업을 정지

ALTER TABLE 테이블명 DISABLE KEYS;


인덱스 작업 재설정

ALTER TABLE 테이블명 ENABLE KEYS;



Bulk Insert 방식 - 파일로 덤프

-SQL을 사용한 방식

 기존의 source 명령어와 유사(백업/복원 참조)

-CSV(Comma Separated Value)파일을 사용한 방식

 <CSV파일을 테이블로 입력>

 LOAD DATA INFILE 'C:\PATH\FILE'

 INTO TABLE 테이블명

 FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY'\\' 

 LINES STARTING BY '' TERMINATED BY '\n'


 <테이블 내용 CSV로 출력>

 SELECT * FROM 테이블명 INTO

 OUTFILE 'c:\PATH\FILE'


LOAD DATA/SELECT INTO OUTFILE의 경우 보안 문제로 특정 디렉토리에만 가능하도록 설정해야함

secure-file-priv=path 옵션


my.ini(my.cnf)파일

[mysqld]

secure-file-priv=c:\mysql\data






트랜잭션

-복수의 SQL문을 수행하는 도중(은행간의 이체)에 장애가 발생했을 때 장애에 대응할수 있도록 하는 기능

-전체수행(Commit)과 전체취소(Rollback) 두가지의 결과값만 가져야 함

-기본적으로 SQL수행모두는 AutoCommit모드(줄단위 커밋모드)

-트랜잭션을 지원하기 위해서는 AutoCommit모드를 오프시켜야 함

-InnoDB 스토리지엔진만 가능함


트랜잭션의 특징(ACID)

-원자성(Atomicity)

  All or Nothing, Commit/Rollback

-일관성(Consistency)

  트랜잭션 전후에 데이터가 손상을 받으면 안됨

  같은 데이터가 다른 값을 가지면 안됨

-고립성/격리수준(Isolation)

  여러 개의 트랜잭션이 수행될 때 성능과 데이터 안정성간의 trade-off

-지속성(Durability)

  트랜잭션이 종료된 이후에도 데이터에 문제가 없어야 됨(장시간)



예시)

트랜잭션 기본 설정 확인

select @@autocomit;

->1일경우 true / 0일경우 false


예시)

AutoCommit 설정 끄기(줄단위 커밋모드 취소)

set autocommit = false;


예시)

Autocommit 설정 끈 이후 커밋/롤백 둘중에 하나 수행

create database;

create table;

insert;

이후에

commit; or rollback;







락(Lock)

공유자원(리소스)에 대해 여러개의 트랜잭션이 접근하려고 경쟁할때 제어하는 방법

-프로그래밍에서는 동기화(synchronization)이라고 함

-동시성제어(Concurrency Control)는 보통 락(lock)으로 해결



락의 종류

-테이블단위 락(Table Lock)

  동일한 테이블을 다른 트랜잭션이 사용하고 있다면 접근 금지 - MyISAM 스토리지 엔진

-줄단위 락(Row Lock)

  동일한 줄(Row)만 접근 금지(테이블 락에 비해 높은 성능) - InnoDB 스토리지 엔진


기본 스토리지엔진 확인

select engine, support from information_schema.engines where support='DEFAULT';


기본 스토리지 엔진 변경(리셋하면 초기화되니 my.ini나 my.cnf에서 변경해야 함)

set default_storage_engine=InnoDB;

set default_storage_engine=MyISAM;


예시)city 테이블 스토리지엔진 확인

select engine from information_schema.TABLES where table_name='city' and table_schmema = 'world';


city테이블 스토리지 엔진 변경하기(이것은 안하는게 좋음 -> 처음부터 만들고 나서 데이터를 넣는게 좋다)

alter table 'city' engine=InnoDB;









격리(isolation)

여러개의 트랜잭션이 수행될때 안정성과 성능이 trade-off관계가 있다

4가지 종류의 단계가 있음

-Read Uncommitted

트랜잭션이 처리되는 도중에 다른 트랜잭션이 해당 데이터를 읽기를 허용

성능은 높지만 데이터의 안정성이 떨어짐(데이터가 바뀔 수 있기 때문)

-Read committed

트랜잭션이 끝난 이후에만 접근하도록 허용(일반적으로 많이 사용-오라클에서 기본설정)

-Serializable

트랜잭션이 동시에 수행되는 것이 금지되고 순차적으로 수행됨(데이터 안정성이 극단적으로 좋아짐)

-Repeatable Read

다른 트랜잭션이 업데이트한느 것은 금지하지만 레코드 추가하는 것은 허용하는 방식(MYSQL에서 기본설정)

트랜잭션이 중간에 값이 변경되더라도 최초의 값을 유지시켜서 처리함

예를 들어 복제나 백업을 할때 최초의 값을 가지고 진행함 중간에 값이 변경되더라도 반영안됨


기본 트랜잭션 격리수준 확인

select @@tx_isolation;


기본 트랜잭션 격리수준 변경

set tx_isolation='READ-COMMITED';

commit;








저장프로시저(stored procedure)

SQL을 함수형태로 저장하고 사용하는 방법(STATIC SQL->속도가 좀 빠르다)


저장프로시저 정의

CREATE PROCEDURE 프로시저명(인자 인자형,....)

BEGIN

      ....SQL 문장들...

END



저장프로시저 호출

CALL 프로시저명;


저장 프로시저 삭제

DROP PROCEDURE 프로시저명;





저장함수(stored function)

SQL을 함수형태로 저장하고 사용하는 방법 + stored procedure에 return 값이 있는 형태


저장함수 정의

CREATE FUNCTION 함수명(인자 인자형,....) RETURNS 타입

BEGIN

      ....SQL 문장들...

END



저장프로시저 호출

함수명(인자);


저장 프로시저 삭제

DROP FUNCTION 함수명;


예시-정의)

DELIMITER //       DELIMITER를//로 변경

CREATE FUNCTION CountLines() RETURNS INTEGER

BEGIN

     DECLARE LINE_COUNT INTEGER;

     SELECT COUNT(*) INTO LINE_COUNT FROM BusinessCard;

     RETURN LINE_COUNT;

END

//

DELIMITER ;    DELIMITER를 ;로 변경



예시-실행)

SELECT countLines() from BusinessCard;







트리거

특수한 저장프로시저(stored procedure)라고 생각하면 됨

특정한 조건이 되면 자동으로 호출(콜백)되는 저장 프로시저

ex)레코드를 삭제하면 자동으로 참조무결성을 체크하는 트리거



트리거 정의

CREATE TRIGGER 트리거명 BEFORE(또는 AFTER) CRUD ON 테이블명 FOR EACH ROW

BEGIN

      변경전(OLD.컬럼명) 또는 변경후(NEW.컬럼명)을 이용한 처리

END


트리거 삭제

DROP PROCEDURE 트리거명;



예시)

BusinessCard 테이블에 레코드가 추가되면 BusinessCard2테이블에 레코드를 추가하는 트리거를 작성

DELIMITER //       DELIMITER를//로 변경

CREATE TRIGGER  InsertBusinessCard2 after insert on BusinessCard for each row

BEGIN

      insert into BusinessCard2 values('zzz', 'zzzzzz'. '000-0000');

END

//

DELIMITER ;    DELIMITER를 ;로 변경









대형 데이터베이스 구축기술

데이터는 계속 늘어남 -> 한 대의 DBMS서버로는 처리능력의 한계

성능 업그레이드(HDD->SSD-> 인메모리 머신)


스케일업

-보통 말하는 업그레이드를 말함

-CPU 클럭속도증가, 코어수증가, 메모리 증가

-보통 성능증가에 비해 가격증가가 더 빠름 -> 비용부담

-병렬컴퓨팅/전용 네트워크 -> 비용부담

-Tiglely-copled system



스케일아웃

-동일한 서버/DBMS를 병렬로 구축

-분산컴퓨팅 -> 비용이 매우 저렴

-loosely coupled system -> 상대적으로 저렴

-노드 수 추가하여 계속 성능 향상 가능 / 효율은 상대적으로 떨어짐



디비에서는 VLDB(Very Larege DBMS)로 성능 항샹 시킴

파티셔닝은 한대의 서버에서 나눔(DB자체적으로 나눔)


1)샤딩(Sharding) -> 여러대의 서버에 나눔

DBMS 내용 분할(DB/테이블)

쓰기성능 향상


2)복제(Replication)

동일한 DBMS를 여러 개 유지(마스터/슬레이브)

읽기성능 향상






NOSQL(Not Only SQL)

-일반 RDBMS가 주로 읽기/검색성능에 최적화

-쓰기 성능이 중요한 경우 좋은 성능을 보이는 경우가 많음

-로그 머신, SNS메신저(밴드, 카카오톡, ...등)

-기존 RDBMS를 완전히 대체하는 것이라기 보다는 보완재의 역할

-특정 기술을 말하는 것이 아니라 일련의 제품군(10가지)을 가리킴

-제품군

MongoDB가 시초

Apache Cassandra(페이스북에 적용), Apache HBASE, Redis ...



CAP 이론을 이용한 NoSQL 시스템 분류

1)C:일관성:Consistency

어떤 노드를 접근하더라도 데이터 값이 동일해야 한다

2)A:가용성:Availability

노드 일부가 Fail되더라도 서비스가 중단이 안 되어야 한다

3)P:파티션 내성:Partition tolerance

노드간 통신에 장애가 생겨도 문제가 없어야 한다


어떤 시스템도 3가지 모두를 만족시킬 수 없다(CA, AP, CP)(2가지만 가능)

CA(일반 RDBMS)

CP(Hbase, MongoDB, Redis)

AP(Cassandra)



저장형태에 따른 NoSQL 시스템 분류

1)키/밸류

키값을 주면 밸류를 리턴하는 형태

JSON과 유사한 형태

Redis


2)정렬된 키/밸류

키값으로 정렬되는 형태

Hadoop, Cassandra, HBase


3)도큐먼트 형태

밸류값이 JSON/XML 문서(파일)인 형태

MongoDB




NoSQL의 특징

-스키마리스

스키마 DDL 기반이 아니라 필요하면 새로운 컬럼(키)를 추가하면 된다

전체적으로 동일한 구조가 아닐 수 있음



데이터 구성방법에 따라 나뉨

RDBMS-정규형 데이터

NoSQL-반정규형 데이터

검색엔진-비정규형 데이터