SELECT * FROM 과 SELECT 컬럼명시 FROM 의 속도차이 1 6 6,496

by 이상훈 [2014.09.02 14:00:09]


안녕하세요 

SELECT * FROM 과 SELECT 컬럼명시 FROM 의 속도차이가 난다고 들었습니다.

그래서 전체 컬럼을 다 가져오더라도 컬럼명을 명시해서 코딩하는데요 .

* 로 했을때 더 느린이유가 뭔가요? 궁금합니다. 

by 김지룡 [2014.09.02 14:17:54]

속도차이가 나는 경우는 index만 읽고 나오느냐 아니면 테이블 액세스까지 일어나느냐에 따라

성능차이가 발생될 수 있기 때문에 전체 컬럼 명시하는데 * 이냐 전체칼럼을 명시해서 코딩하나 차이가 발생하지는 않습니다.


by 이상훈 [2014.09.02 14:35:03]

답변감사합니다 도움이 되었습니다 ^^


by 마농 [2014.09.02 14:22:29]

조회 결과가 같다면? (즉, 전체컬럼을 다 가져오는 경우라면?)
  - * 이나 컬럼리스트나 속도차 없습니다.


조회 결과가 다르다면?
  - 모든 컬럼을 다 가져오는 * 보다는 컬럼을 더 적게 가져오는 컬럼리스트가 당연히 빠르겠죠.


여기서 빠르다 느리다의 차이는 여러가지 관점에서 볼 필요가 있습니다.
  - * 을 사용할 때와 컬럼리스트를 사용할 때의 실행계획이 달라질 수 있습니다.
    실행계획이 달라진다면 스캔 속도도 달라집니다.
    그러나 실행계획이 같다면 스캔 속도는 같습니다.
  - 정렬 및 운반 속도 는 실행계획이 같더라도 컬럼수(data size)에 영향을 받습니다.


즉, 필요한 항목만 기술하는 것이 여러모로 좋습니다.
필요한 항목만 기술하는 경우 최적의 실행계획을 세울 확률이 높아지며
필요한 항목만 기술하는 경우 정렬속도 및 운반속도도 개선됩니다.


그렇다고 해서 모든 항목이 필요한 경우까지 일부러 컬럼리스트를 적을 필요까지는 없을 듯 하구요.


by 이상훈 [2014.09.02 14:35:17]

항상 좋은 답변 주셔서 감사합니다 ^^


by DJ [2014.09.02 14:52:06]

당연히 필요한 column 만 명시해서 가자고 오는것이 성능에 좋습니다. 조금 다른 관점에서 이유를 말씀드리면,

물리설계 관련된 내용이기도 한데요. Oracle은 Data 접근 방법상 앞쪽에 위치한 column의 data 추출하는 것과 뒷쪽 column data를 추출하는 것은 속도 차이가 날 수 있습니다. 그래서 자주 access 되는 column은 앞쪽으로 위치시키게 권장하는 것입니다.

그 이유는 Oracle이 data를 block에 저장할때 모든 column의 위치정보를 header에 두는 것이 아니라서 그렇습니다. 예를 들어 특정 row 에서 두번째 column 정보를 읽으려면 1-2번째 column data의 길이정보를 읽어와야 되며, 이런식으로 10번째 column에 있는 data를 읽으려면 1-10 번째 data 의 길이정보를 읽어와야 되어 그런것입니다.

출처 : Troubleshooting Oracle Performance 2nd Edition - Chapter 16 Optimizing The Physical Design


by 아발란체 [2014.09.05 11:32:34]

다른 관점으로, 인덱스 항목이 아니라면 항목 1개나 n개를 가지고 오나 FETCH 하는 건수는 동일하며 항목 1개를 가지고 온는 것을 맹신하여 테이블 안에 항목 수를 많이 두면 오버헤드가 발생합니다.

 

데이타 볼륨을 무시한다면 I/O, 네트워크, 메모리 오버헤드가 모두 동일하기 때문에 *나 항목 1개나 동일하기 때문에 테이블을 목적에 따라 최적화 하여 설계하는 것이 중요한 것 같습니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입