Database #DB특성 #성능향상

곽서현·2022년 11월 6일
0

DB 사용하는 이유

  • DB가 존재하기 이전에는 파일 시스템을 이용하여 데이터를 관리하였는데,
  • 파일 처리 시스템에서 데이터의 종속성, 중복성이 발생하였고 파일 관리 시스템에서 중복성 문제가 발생하여 이를 해결하기 위해 DB 등장했다.
  • 데이터 종속성(dependency): 응용 프로그램과 데이터가 상호 의존관계를 맺고 있는 것
    → 데이터의 구성 방법이나 접근 방법을 변경하면 관련된 응용 프로그램도 함께 변경해야 함
  • 데이터 중복성(redundancy): 한 시스템 내에 같은 내용의 데이터가 여러 파일에 중복 저장된 것

DB 특성

  • 데이터 독립성

    • 논리적 독립성: DB는 논리적인 구조로 다양한 응용 프로그램의 논리적 요구를 만족시켜줄 수 있다.
    • 물리적 독립성: DB 사이즈나 성능 향상을 위해 데이터 파일을 늘리거나 새롭게 추가하더라도 관련된 응용 프로그램을 수정할 필요가 없다.
  • 데이터 무결성: 여거 경로를 통해 잘못된 데이터가 발생하는 경우의 수를 방지하는 기능으로 데이터의 유효성 검사를 통해 무결성을 구현한다.

  • 데이터 보안성: 인가된 사용자들만 DB나 DB 내의 자원에 접근할 수 있도록 설정함으로써 모든 데이터에 보안을 구현할 수 있다.

  • 데이터 일관성: 연관된 정보를 논리적인 구조로 관리함으로써 어떤 하나의 데이터만 변경했을 경우 발생할 수 있는 데이터의 불일치성을 배제할 수 있다. 또한 작업 중 일부 데이터만 변경되어 나머지 데이터와 일치하지 않는 경우의 수를 배제할 수 있다.

  • 데이터 중복 최소화: DB는 데이터를 통합해서 관리함으로써 파일 시스템의 단점 중 하나인 자료의 중복과 데이터의 중복 문제를 해결할 수 있다.

DB 성능

데이터베이스의 성능 이슈는 디스크 I/O 를 어떻게 줄이느냐에서 시작된다. 디스크 I/O 란 디스크 드라이브의 플래터(원판)을 돌려서 읽어야 할 데이터가 저장된 위치로 디스크 헤더를 이동시킨 다음 데이터를 읽는 것을 의미한다. 이 때 데이터를 읽는데 걸리는 시간은 디스크 헤더를 움직여서 읽고 쓸 위치로 옮기는 단계에서 결정된다. 즉 디스크의 성능은 디스크 헤더의 위치 이동 없이 얼마나 많은 데이터를 한 번에 기록하느냐에 따라 결정된다고 볼 수 있다.

그렇기 때문에 순차 I/O 가 랜덤 I/O 보다 빠를 수 밖에 없다. 하지만 현실에서는 대부분의 I/O 작업이 랜덤 I/O 이다. 랜덤 I/O 를 순차 I/O 로 바꿔서 실행할 수는 없을까? 이러한 생각에서부터 시작되는 데이터베이스 쿼리 튜닝랜덤 I/O 자체를 줄여주는 것이 목적이라고 할 수 있다.

DB 쿼리 튜닝

https://velog.io/@gillog/SQL-%ED%8A%9C%EB%8B%9D

  • SQL 튜닝이란, SQL문을 최적화하여 빠른 시간내에 원하는 결과값을 얻기 위한 작업

💡 튜닝 규칙

  1. 가능하면 커서(Cursor)를 피하라.
  2. 커서를 피할 수 없다면, 임시 테이블(temp table)을 사용하라
  3. 임시 테이블을 현명하게 사용하라
  4. 데이터를 미리 준비하라
  5. 복합 뷰(Nested View)를 최소화하라
  6. UPDATE 문 대신 CASE 문을 사용하라
  7. 스칼라(Scalar) 대신 테이블 반환 함수(Table-Valued Functions)를 사용하라
  8. SQL 서버에서 분할(Partition)을 활용하라
  9. 배치 모드로 삭제(Delete)와 갱신(Update) 작업을 하라
  10. 서두르지 말고 천천히 하라
  11. ORM을 피하라
  12. 가능한 경우, 저장 프로시저(Stored Procedure)를 사용하라
  13. 더블 디핑(Double-Dipping: 중복 처리)을 피하라
  14. 커다란 트랜잭션은 작은 트랜잭션 여러 개로 쪼개라
  15. 트리거(Trigger) 사용을 자제하라
  16. GUID(범용 고유 식별자)에 대한 클러스터링을 피하라
  17. 테이블에 있는 모든 것을 카운트(Count)하지 말라
  18. 행을 카운트하려면 시스템 테이블(System Table)을 사용하라
  19. 필요한 수의 열만 끌어오라
  20. 네거티브 검색(Negative Search)를 피하기 위해 쿼리를 재 작성하라
  21. 맹목적으로 코드를 재사용하지 말라
  22. 가급적 WHERE 조건에서는 인덱스 컬럼을 모두 사용한다.
  23. 인덱스 컬럼에 사용하는 연산자는 가급적 동등 연산자(=)를 사용하라.
  24. 인덱스 컬럼은 변형하여 사용하지 않도록 한다.
  25. OR 보다는 AND를 사용해라.
  26. 그룹핑 쿼리를 사용할 경우 가급적 HAVING 보다는 WHERE 절에서 데이터를 필터링하라.
  27. DISTINCT는 가급적 사용하지 않는다.
  28. IN, NOT IN 대신 EXISTS 와 NOT EXISTS를 사용하라
  29. SET 연산자 사용시 UNION 대신 UNION ALL을 사용하라.
    ** 상세 내용은 본 글 링크 참고

0개의 댓글