목차
- 개요
- SELECT * FROM table 이 안좋은 7가지 이유
2-1. 불필요한 I/O(입력 출력)
2-2. 네트워크 트래픽 증가
2-3. 애플리케이션 메모리 낭비
2-4. ResultSet의 컬럼 순서에 의존하는 결과
2-5. 테이블에 새로운 컬럼을 추가하면 뷰에 오류 발생
2-6. JOIN 쿼리 충돌
2-7. 테이블 간에 데이터를 복사할 때 문제 발생
- 결론
1. 개요
쿼리를 조회할 경우, SELECT * FROM table
문을 자주 사용했다. *
을 이용해 모든 칼럼의 데이터를 가져오는 것 보다 필요한 칼럼을 명시해서 가져오는게 더 좋다고 키워드를 던져 주셔서 찾아 보게 되었다.
2. SELECT * FROM table 이 안좋은 7가지 이유
처음 SQL을 배울때 기본적으로 SELECT * FROM table과 같이 테이블을 조회하는 것으로 학습을 시작한다. 다음과 같은 쿼리문 작성이 좋지 않은 습관이라고 하는데 안좋은 이유에 대해 아래와 같이 알아보자.
2-1. 불필요한 I/O(입력 출력)
SELECT *
를 사용하면 사용되지 않을 불필요한 데이터를 반환할 수 있다. 인덱스 페이지에서 데이터를 읽을 수 있었을 때 페이지에서 모든 데이터를 읽게 되므로 데이터베이스 끝에서 IO 사이클이 낭비될 수 있다.
2-2. 네트워크 트래픽 증가
SELECT *
는 명백하게 클라이언트에서 필요한 것 보다 많은 데이터를 반환하므로 네트워크 대역폭을 더 많이 사용한다. 이는 클라이언트 어플리케이션에 전송되는 데 더 큰 시간이 든다는 말도 된다. 여기서 말한 클라이언트에는 당신이 쿼리를 실행하는 SQL Server Maganement, Toad, SQL Developer for Oracle
같은 쿼리 에디터와 Java 어플리케이션등이 포함된다.
2-3. 애플리케이션 메모리 낭비
사용하지 않을 데이터를 저장하고 있느라 어플리케이션의 메모리가 낭비된다.
2-4. ResultSet의 컬럼 순서에 의존하는 결과
어플리케이션이 SELECT *
쿼리를 사용하며 컬럼 순서에 의존하고 있다면, 컬럼 추가나 순서 변경이 result set에 영향을 미친다.
2-5. 테이블에 새로운 컬럼을 추가하면 뷰에 오류 발생
SELECT *
쿼리를 사용하면 새로운 칼럼을 추가하거나 삭제 했을 때 알아채기 힘든 오류를 발생 시킬 수 있다.
2-6. JOIN 쿼리 충돌
SELECT *
를 JOIN
쿼리에서 사용하면 같은 컬럼 이름을 가진 여러 테이블이 충돌을 일으킬 수 있다. straight query(서브쿼리가 없는 쿼리)
를 사용하면 충돌은 없겠지만, Common Table Expression
이나 파생 테이블
에서 한 컬럼을 기준으로 정렬하려고 할때 추가적인 조치가 필요해진다.
2-7. 테이블 간에 데이터를 복사할 때 문제 발생
한 테이블에서 다른 테이블로 데이터를 복사하는 일반적인 방법인 SELECT * into INSERT .. SELECT 문을 사용할 때 두 테이블 사이의 열 순서가 동일하지 않으면 잠재적으로 잘못된 데이터를 잘못된 열에 복사할 수 있다.
3. 결론
위와 같은 이유로 SQL 쿼리에서 SELECT *
문의 사용을 지양해야 한다. SELECT 쿼리에서 *
을 사용하는 것 보다 명시적인 컬럼명을 사용하는 것이 항상 더 좋다. 쿼리문 수행이 개선될 뿐 아니라 코드도 명확해진다. 거기다 특히 뷰가 있는 상황에서 테이블에 새로운 컬럼을 추가했을 때도 문제가 없기에, 코드의 유지보수 측면에서도 도움이 된다.
참고
Uploaded by N2T
'Database' 카테고리의 다른 글
SQL Mapper vs ORM 기술 (0) | 2024.06.19 |
---|---|
테이블마다 id 칼럼을 PK로 사용한 이유는 무엇일까? (0) | 2024.02.14 |
MySQL 실행계획이란? (0) | 2023.11.20 |
공유 락(shared lock) vs 배타 락(exclusive lock) (0) | 2023.11.16 |
Redis란? (1) | 2023.11.14 |