- 데이터 종속성(dependency): 응용 프로그램과 데이터가 상호 의존관계를 맺고 있는 것
→ 데이터의 구성 방법이나 접근 방법을 변경하면 관련된 응용 프로그램도 함께 변경해야 함- 데이터 중복성(redundancy): 한 시스템 내에 같은 내용의 데이터가 여러 파일에 중복 저장된 것
데이터 독립성
데이터 무결성: 여거 경로를 통해 잘못된 데이터가 발생하는 경우의 수를 방지하는 기능으로 데이터의 유효성 검사를 통해 무결성을 구현한다.
데이터 보안성: 인가된 사용자들만 DB나 DB 내의 자원에 접근할 수 있도록 설정함으로써 모든 데이터에 보안을 구현할 수 있다.
데이터 일관성: 연관된 정보를 논리적인 구조로 관리함으로써 어떤 하나의 데이터만 변경했을 경우 발생할 수 있는 데이터의 불일치성을 배제할 수 있다. 또한 작업 중 일부 데이터만 변경되어 나머지 데이터와 일치하지 않는 경우의 수를 배제할 수 있다.
데이터 중복 최소화: DB는 데이터를 통합해서 관리함으로써 파일 시스템의 단점 중 하나인 자료의 중복과 데이터의 중복 문제를 해결할 수 있다.
데이터베이스의 성능 이슈는 디스크 I/O 를 어떻게 줄이느냐에서 시작된다. 디스크 I/O 란 디스크 드라이브의 플래터(원판)을 돌려서 읽어야 할 데이터가 저장된 위치로 디스크 헤더를 이동시킨 다음 데이터를 읽는 것을 의미한다. 이 때 데이터를 읽는데 걸리는 시간은 디스크 헤더를 움직여서 읽고 쓸 위치로 옮기는 단계에서 결정된다. 즉 디스크의 성능은 디스크 헤더의 위치 이동 없이 얼마나 많은 데이터를 한 번에 기록하느냐에 따라 결정된다고 볼 수 있다.
그렇기 때문에 순차 I/O 가 랜덤 I/O 보다 빠를 수 밖에 없다. 하지만 현실에서는 대부분의 I/O 작업이 랜덤 I/O 이다. 랜덤 I/O 를 순차 I/O 로 바꿔서 실행할 수는 없을까? 이러한 생각에서부터 시작되는 데이터베이스 쿼리 튜닝은 랜덤 I/O 자체를 줄여주는 것이 목적이라고 할 수 있다.
https://velog.io/@gillog/SQL-%ED%8A%9C%EB%8B%9D
💡 튜닝 규칙
- 가능하면 커서(Cursor)를 피하라.
- 커서를 피할 수 없다면, 임시 테이블(temp table)을 사용하라
- 임시 테이블을 현명하게 사용하라
- 데이터를 미리 준비하라
- 복합 뷰(Nested View)를 최소화하라
- UPDATE 문 대신 CASE 문을 사용하라
- 스칼라(Scalar) 대신 테이블 반환 함수(Table-Valued Functions)를 사용하라
- SQL 서버에서 분할(Partition)을 활용하라
- 배치 모드로 삭제(Delete)와 갱신(Update) 작업을 하라
- 서두르지 말고 천천히 하라
- ORM을 피하라
- 가능한 경우, 저장 프로시저(Stored Procedure)를 사용하라
- 더블 디핑(Double-Dipping: 중복 처리)을 피하라
- 커다란 트랜잭션은 작은 트랜잭션 여러 개로 쪼개라
- 트리거(Trigger) 사용을 자제하라
- GUID(범용 고유 식별자)에 대한 클러스터링을 피하라
- 테이블에 있는 모든 것을 카운트(Count)하지 말라
- 행을 카운트하려면 시스템 테이블(System Table)을 사용하라
- 필요한 수의 열만 끌어오라
- 네거티브 검색(Negative Search)를 피하기 위해 쿼리를 재 작성하라
- 맹목적으로 코드를 재사용하지 말라
- 가급적 WHERE 조건에서는 인덱스 컬럼을 모두 사용한다.
- 인덱스 컬럼에 사용하는 연산자는 가급적 동등 연산자(=)를 사용하라.
- 인덱스 컬럼은 변형하여 사용하지 않도록 한다.
- OR 보다는 AND를 사용해라.
- 그룹핑 쿼리를 사용할 경우 가급적 HAVING 보다는 WHERE 절에서 데이터를 필터링하라.
- DISTINCT는 가급적 사용하지 않는다.
- IN, NOT IN 대신 EXISTS 와 NOT EXISTS를 사용하라
- SET 연산자 사용시 UNION 대신 UNION ALL을 사용하라.
** 상세 내용은 본 글 링크 참고