데이터베이스 관리 시스템(DBMS) & 튜닝 본문

백앤드 개발일지/데이터베이스

데이터베이스 관리 시스템(DBMS) & 튜닝

giron 2021. 7. 23. 12:41
728x90

백앤드 개발자의 친구 데이터베이스를 알아보려고 한다

[데이터베이스의 특징]

  • 실시간 접근성 : 사용자의 질의에 대하여 즉시 처리하여 응답한다.
  • 계속적인 진화 : 삽입, 삭제, 갱신을 통하여 항상 최근의 정확한 데이터를 동적으로 유지한다.
  • 동시 공유 : 여러 사용자가 동시에 원하는 데이터를 공유할 수 있는 특징을 갖는다.
  • 내용에 의한 참조 : 데이터베이스에 있는 데이터를 참조할 때 투플(tuple)의 주소나 위치가 아닌 사용자가 요구하는 데이터 내용에 따라 참조한다.
  • 데이터 논리적 독립성 : 응용프로그램과 데이터베이스를 독립시킴으로써 데이터 논리적 구조를 변경시키더라도 응용프로그램은 변경되지 않는다.

[데이터베이스 관리 시스템]

  • 데이터베이스를 조작하는 별도의 소프트웨어로, DBMS를 통해 데이터베이스를 관리하여 응용 프로그램들이 데이터베이스를 공유하고, 사용할 수 있는 환경을 제공
  • 데이터베이스를 구축하는 틀을 제공하고, 효율적으로 데이터를 검색하고 저장하는 기능 제공
  • 인터페이스 제공, 장애에 대한 복구 기능, 유저 권한에 따른 보안성 유지 기능 등 제공
  • 자료의 중복성 제거, 무결성, 일관성, 유용성을 보장하기 위해서 자료를 제거하고 관리하는 소프트웨어 체계

[DBMS의 장점과 유형]

  • 자료와의 관계성을 정의하기 때문에 자료의 통합성 증진, 접근성 용이, 데이터 통제 강화, 보안 강화
  • 관계형 데이터베이스 관리 시스템(RDBMS)
  • NoSQL DBMS
  • 인 메모리 데이터베이스 관리 시스템(IMDBMS)
  • 기둥형 데이터베이스 관리 시스템(CDBMS)

[DBMS의 종류]

[DBMS vs FIle]

그렇다면 왜 file로도 관리할 수 있는데, DBMS를 이용할까? 

 -> 표준, 보안: db는 모두가 함께 사용하기 때문에 표준이 중요하다 따라서 file보다 DBMS를 이용하는 것 같다.

 

[옵티마이저]

  • 사용자가 요청한 SQL을 가장 효율적이고 빠르게 수행할 수 있는 최적의 처리경로를 선택해주는 DBMS의 핵심 엔진을 말함

[데이터베이스 성능 튜닝]

  • 응용 개발자 - SQL문장들을 튜닝함
  • Oracle을 사용할 경우라면, EXPLAIN PLAN이나 TKPROF등의 유틸리티의 사용에 친숙해지고 그들의 프로그램에 광범위하게 적용할 수 있어야 한다.

튜닝에 대해 설명하기 전, 간단한 용어 정리부터 하고 넘어가보겠다!

  • 인덱스 : 추가적인 쓰기 작업과 저장 공간을 활용하여 데이터베이스 테이블의 검색 속도를 향상시키기 위한 자료구조, 즉 포인터와 비슷하다고 생각하면 되겠다.
    • 인덱스를 사용하지 않는 컬럼을 조회하려면 Full Scan(전체 탐색)을 해야하는데 이러면 전체를 비교하고 탐색하기 때문에 처리속도가 떨어진다.
    • INSERT: 새로운 데이터에 대한 인덱스를 추가함
    • DELETE: 삭제하는 데이터의 인덱스를 사용하지 않는다는 작업을 진행함
    • UPDATE: 기존의 인덱스를 사용하지 않음 처리하고, 갱신된 데이터에 대해 인덱스를 추가함
  • 인덱스는 테이블 조회 속도아 성능을 향상 시킬 수 있지만 DB의 10%정도의 저장공간이 필요하고, 인덱스를 잘못 사용할 경우 오히려 성능이 저하된다.
  • 이 외에 인덱스 자료구조에 Hash Table, B+ Tree 등이 있는데 https://mangkyu.tistory.com/96 이 블로그를 참고하면 좋을것 같다!

[sql튜닝]

  • 가급적 WHERE 조건에서는 인덱스 칼럼을 모두 사용 : 인덱스를 만들어 놓더라도 WHERE 조건을 어떻게 명시하느냐에 따라 옵티마이저가 인덱스를 사용할 수도 있고 사용하지 않을 수도 있다.
     ex)  ORDER 테이블에서 ORDER_NO, ORDER_REV 컬럼이 ORD_NO_IDX 인덱스로 만들어져 있을  때, 아래와 같은 쿼리는 인덱스를 사용하지 않고 FULL SCAN을 하게 된다.
    SELECT * FROM ORDER
    WHERE ORDER_REV ='1'​
     아래처럼 사용해야 한다.
SELECT * FROM ORDER
WHERE ORDER_NO = '900000'
AND ORDER_REV = '1'
  • 인덱스 칼럼에 사용하는 연산자는 가급적 '='을 사용하라 :인덱스 컬럼을 WHERE조건에 모두 명시하였더라도 LIKE와 같은 연산자를 사용하면 인덱스 효율이 떨어진다.
    • LIKE 외에도 IS NULL, IS NOT NULL, NOT IN 등이 사용되었을 경우에도 마찬가지 현상이 발생한다.
  • 인덱스 컬럼은 변형하여 사용하지 않도록 한다 : WHERE 조건에 인덱스 컬럼을 사용했고, 동등 연산자를 사용했다 하더라도 인덱스 컬럼에 변형을 가하게 되면 인덱스를 사용하지 못한다.
  • OR 보다는 AND를 사용해라 
  • 그룹핑 쿼리를 사용할 경우 가급적 HAVING 보다는 WHERE 절에서 데이터를 필터링하라 : 그룹핑 쿼리 처리순서는 WHERE 조건이 먼저 처리되므로 가급적 필터링 할 대상은 WHERE 조건에서 처리할 수 있게 쿼리를 작성하도록 한다
  • DISTINCT는 가급적 사용하지 마라 : DISTINCT는 내부적으로 정렬을 수행하기 때문에 가급적 피하는게 좋다. (제가 알기론 서브쿼리를 이용해서 풀라고 알고 있습니다!)
  • IN, NOT IN 대신 EXISTS 와 NOT EXISTS를 사용하라

 

Reference

 

데이터베이스 관리 시스템(DBMS)의 정의와 종류

데이터들이 모여있는 데이터들의 집합인 데이터베이스(Database)를 관리할 수 있는 데이터베이스 관리시스...

blog.naver.com

 

SQL 튜닝 (일반적인 SQL 튜닝 기법)

개발자라면 옵티마이저가 실행계획을 생성할 때, 최대한도로 성능을 발휘할 수 있도록 불필요한 로직을 타지 않게 쿼리를 작성해야 한다. 같은 결과를 산출하는 쿼리는 여러 가지 형태로 작성

cornswrold.tistory.com

 

 

728x90
Comments