*는 별표이며 문자라고도 하고 애스터리크(Asterisk)라고 하는데요. 상징,기호,표시,각주,참고 등 여러 의미가 있는것 같습니다. 시스템을 개발하거나 운영하는 경우 대체로 EAI에서 여러 DB와 연계할때 SELECT * 를 아니면 SELECT 컬럼명으로 조회하는 경우가 있는데 습관적으로 사용하는 방법에 대해 간략하게 정리를 해보고 나중에 구체적인 내용도 기회되면 내용을 추가해봐야겠습니다.
- * 사용시 불필요한 컬럼까지 Fetch하게 됩니다.(응답시간이 증가)
- Index only access, Index only scan을 사용할수 없습니다.(select할 컬럼에 인덱스 존재 시)
- SybaseIQ같은 DB는 Column in block저장방식을 택하고 있어 아스타리크를 사용 시 성능차이가 클수 있다고 합니다.(DB마다 다를듯)
- SELECT * 은 가독성 및 향후 운영(유지보수 관점)을 위해 지양한다고 합니다.
- Spring같은 프레임워크에서는 자동매핑을 선호하여 select *를 사용하는 경우가 있다고 합니다.(단, 컬럼명 수정/삭제 되는 경우 오류가 발생될수 있다고 함)
- 리소스 사용률이 높아지고 지연시간이 길어질수 있다고 합니다.
- SELECT *를 사용 시 많은 열의 캐싱을 시도합니다.(사이즈가 큰 TEXT나 BLOB 컬럼타입도 존재)
- SELECT *를 사용하여 다른 테이블로 복사 시 잘못된 열에 복하는 경우도 있다고 합니다.(두개의 테이블의 컬럼순서가 다른경우)
이렇게보면 자신이 조회하는 테이블구조나 컬럼타입 등을 잘 안다면 적절하게 SELECT *도 사용이 가능할것 같은데요. 그게 아닌 EAI처럼 조회하는 테이블쿼리만 제공받아 인터페이스를 진행해야하는 경우는 SELECT 컬럼명으로 진행하는게 좋을것 같고 성능해도 좋다고하는데 얼마나 좋은지는 모르겠군요.
그외
- COUNT(*)는 Null를 포함한 카운터를 의미합니다.
- COUNT(컬럼명,컬럼인덱스)는 NULL를 제외한 카운터 조회합니다.
- COUNT(*)는 COUNT(컬럼)보다 지향하는 이유는 NULL이 있는지 Validation체크도 한다고 합니다.
- COUNT(*)보다 COUNT(1)를 많이 사용하는것 같습니다.
- COUNT(*)는 Null데이터 비율에 따라 속도차이가 있다고 합니다.
저도 작업하는 테이블에 count(*)를 조회했었는데 어느순간에 count(1)를 하게 되었네요. 내용을 정리하다보니 카운터를 조회할때 *,컬럼명,컬럼인덱스 에 따라서 결과가 달라질수도 있을것 같은데 이런부분에 대해 이해하고 사용을 해야겠습니다.
댓글 없음:
댓글 쓰기