본문 바로가기
Database

SELECT * 을 쓰면 안되는 이유

by Jammini 2023. 11. 29.
728x90

목차

  1. 개요
  1. SELECT * FROM table 이 안좋은 7가지 이유

    2-1. 불필요한 I/O(입력 출력)

    2-2. 네트워크 트래픽 증가

    2-3. 애플리케이션 메모리 낭비

    2-4. ResultSet의 컬럼 순서에 의존하는 결과

    2-5. 테이블에 새로운 컬럼을 추가하면 뷰에 오류 발생

    2-6. JOIN 쿼리 충돌

    2-7. 테이블 간에 데이터를 복사할 때 문제 발생

  1. 결론

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