SELECT INV.* FROM ( SELECT A, B, C, D FROM TABLE ) INV
위 쿼리문 처럼 서브쿼리에서 컬럼을 특정해놓은 경우에는 애스터리스크를 써서 컬럼명을 가져오는것도 속도와 상관없는지 궁금합니다.
보통 * 를 쓰지 않도록 가이드하는건.. 사용하지 않는 컬럼의 데이터를 읽는 디스크 I/O & 전송하는데 사용하는 네트워크 I/O 의 낭비를 막기 위한거니까요.
예제와 같은 경우라면.. 상관 없는게 맞다고 보입니다.
답변 감사합니다!
가독성좋은 SQL 작성측면에서는 애스터리스크와 컬럼명나열중 어떤것이 더 괜찮을까요 ?
쿼리가 변경되어 조인 테이블이 늘어나든지 하는 경우에 불필요한 컬럼을 전송하게 될 가능성이 있으니 되도록 사용할 컬럼을 명시적으로 나열하는 게 좋지 않을까요?^^ 참고로 테이블의 경우에는 블록단위로 읽게 되므로 컬럼을 명시하더라도 대부분 한 row 데이터를 다 읽게 되지만(disk) *를 사용하여 모든 컬럼을 나열하게 되면 네트워크 데이터 전송량이 늘어납니다.
@아플라
컬럼명을 명시하는 쪽을 선호합니다.
* 를 사용하는 구문은 주로 COUNT(*), EXISTS (SELECT * ~) 정도입니다.
네. 속도와 상관은 없습니다.
하지만, 굳이 인라인뷰를 쓸 이유가 없어 보이는 쿼리네요.
답변감사합니다!
실제 코드의 일부분만 가져와서 예시를 간략화하다보니 그런것같습니다..ㅎㅎ
실제로는 인라인뷰로 다중 조인이 발생하는쿼리였습니다.
SQL 의 가독성을 높이기 위한 제 개인적인 SQL 작성 규칙 입니다.
- 적당한 줄바꿈(엔터)과 줄맞춤(들여쓰기)이 필요합니다.
- 항목별로 줄바꿈 하고, 컴마는 앞쪽에 둡니다.
- SELECT, FROM, WHERE 뒤쪽 공백에 줄맞춤 합니다.
- 명령어(대문자)와 명칭(소문자)의 대소문자를 구별합니다.
- 알리아스는 약어를 쓰는 것 보다는 그냥 a, b, c 쓰는게 더 깔끔해 보이네요.
SELECT c.*
FROM (SELECT a.a
, a.b
, b.c
, b.d
FROM table1 a
, table2 b
WHERE a.id = b.id
AND a.col = 1
) c
WHERE ROWNUM = 1
;