https://prolog.techcourse.co.kr/studylogs/2350

https://dzone.com/articles/why-you-should-not-use-select-in-sql-query-1

불필요한 I/O (인풋, 아웃풋)

select * 을 사용하면 불필요한 데이터까지 불러온다. 하지만 그 데이터를 불러오는데 비용이 들고, 페이지에서 데이터를 읽어오는 동안 I/O 사이클이 낭비된다. 이는 또한 쿼리 실행 속도에 영향을 준다.

→ 이해안됨

네트워크 트래픽 증가

select * 을 사용하면 실제 조회하려는 데이터보다 더 많은 데이터를 읽어와 더 많은 네트워크를 사용한다. 이는 클라이언트 어플리케이션에 전송하는데 더 큰 시간이 든다는 말과 같다.

어플리케이션 메모리 낭비

사용하지 않을 데이터까지 저장하느라 더 많은 메모리가 낭비된다.

ResultSet 의 컬럼 순서에 의존

컬럼 추가 및 순서 변경을 하면 ResultSet 을 활용한 코드도 수정해야 한다.

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

select * 을 사용하여 뷰를 선언하면 테이블에 컬럼을 추가하거나 기존 컬럼을 삭제했을 때 미세한 오류가 발생할 수 있다. 뷰가 틀린 결과를 반환하기 때문이다.

→ 이해안됨

JOIN 쿼리 충돌

SELECT * 를 JOIN 쿼리에서 사용하면 같은 컬럼 이름을 가진 여러 테이블이 충돌을 일으킬 수 있다. straight query(서브쿼리가 없는 쿼리) 를 사용하면 충돌은 없겠지만, Common Table Expression 이나 파생 테이블 에서 한 컬럼을 기준으로 정렬하려고 할때 추가적인 조치가 필요해진다.

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

한 테이블에서 다른 테이블로 데이터를 복사할 때 SELECT * into INSERT .. SELECT 문을 흔히 사용하는데, 두 테이블 간에 컬럼 순서가 다르면 잠재적으로 틀린 데이터를 복사할 수 있다. 몇 개발자들은 EXISTS clause 에서 SELECT * vs. SELECT 1 사용하는 게 정적 값을 검사하는 추가 작업을 하지 않아(DB를 잘 몰라 의역합다) 더 빠르다 생각하는데, 요새는 EXISTS 문에 대한 처리가 잘 되어 있어 select 문과 완전히 무관하다.