을 감안할 때 당신의 당신이 있음을 지정 하는 모든 열을 선택, 약간의 차이가 이 시간에이 . 그러나 데이터베이스 스키마가 변경됨을 인식하십시오. 당신이 사용하는 경우SELECT *
, 당신의 코드는 그 새로운 데이터를 사용하거나 제시 할 준비가되어 있지 않더라도, 테이블에 새로운 열을 추가하게 될 것입니다. 이는 시스템이 예기치 않은 성능 및 기능 변경에 노출되고 있음을 의미합니다.
이 비용을 약간의 비용으로 기꺼이 기각 할 수도 있지만 필요하지 않은 열은 다음과 같아야합니다.
- 데이터베이스에서 읽기
- 네트워크를 통해 전송
- 프로세스에 마샬링
- (ADO 유형 기술의 경우) 메모리 내 데이터 테이블에 저장
- 무시 및 폐기 / 가비지 수집
항목 # 1에는 잠재적 인 커버링 색인을 제거하고 데이터 페이지로드 (및 서버 캐시 스 래싱)를 유발하고 행 / 페이지 / 테이블 잠금이 발생하는 등 다른 숨겨진 비용이 발생합니다.
열을 지정하는 *
잠재적 절감 효과와 유일한 절약 효과를 비교하면 다음 과 같습니다.
- 프로그래머는 열을 추가하기 위해 SQL을 다시 방문 할 필요가 없습니다.
- SQL의 네트워크 전송이 더 작거나 빠릅니다
- SQL Server 쿼리 구문 분석 / 유효성 검사 시간
- SQL Server 쿼리 계획 캐시
항목 1의 경우 실제로는 추가 할 수있는 새로운 열을 사용하기 위해 코드를 추가 / 변경한다는 것이 현실입니다.
항목 2의 경우, 그 차이만으로도 다른 패킷 크기 나 수의 네트워크 패킷으로 이동할 수 없습니다. SQL 문 전송 시간이 주요 문제가되는 시점에 도달하면 먼저 문 비율을 줄여야합니다.
항목 3의 *
경우 어쨌든 확장이 발생해야 하므로 비용을 절약 할 수 없습니다 . 이는 어쨌든 테이블 스키마를 참조하는 것을 의미합니다. 실제로 열을 나열하면 스키마에 대해 유효성을 검사해야하므로 동일한 비용이 발생합니다. 다시 말해 이것은 완전한 세척입니다.
항목 4의 경우 특정 열을 지정하면 쿼리 계획 캐시가 커질 수 있지만 다른 열 집합 (지정하지 않은 열)을 처리하는 경우 에만 가능합니다. 이 경우에, 당신은 원하는 게 필요에 따라 서로 다른 계획을 원하기 때문에 다른 캐시 항목을.
따라서 질문을 지정한 방식으로 인해 최종 스키마 수정에 직면 한 문제 복구에 문제가 발생합니다. 이 스키마를 ROM으로 굽는 경우 (발생), *
완벽하게 허용됩니다.
그러나 내 일반적인 지침은 필요한 열만 선택해야한다는 것입니다. 즉, 때로는 모든 열을 요구하는 것처럼 보일 수 있지만 DBA 및 스키마 진화는 쿼리에 큰 영향을 줄 수있는 새로운 열이 나타날 수 있음을 의미합니다 .
내 충고는 항상 특정 열을 선택 해야한다는 것 입니다. 반복해서하는 일에 능숙 해 지므로 올바르게하는 습관을 가지십시오.
코드 변경없이 스키마가 변경 될 수있는 이유가 궁금하다면 감사 로깅, 유효 / 만료 날짜 및 DBA가 규정 준수 문제에 대해 체계적으로 추가하는 기타 유사한 사항을 고려하십시오. 미처리 변경의 또 다른 원인은 시스템 또는 사용자 정의 필드의 다른 곳에서 성능이 저하되는 것입니다.