2010-02-03 3 views
0

테이블에서 여러 열을 선택하는 쿼리의 성능을 향상시키고 자합니다. 열 수를 제한하면 쿼리 성능에 영향을 미칠지 궁금해하고있었습니다.쿼리 성능에 대한 예측 횟수의 영향

+0

가변 길이 데이터 형식을 사용하여 후행 열을 반환하면 코드 표시 및 INCLUDE 작동 방식을 나타내는 인덱스 추가에 대한 검색 오버 헤드 –

답변

1

열 수를 제한해도 쿼리에 미치는 영향은 없습니다. 거의 보편적으로 전체 행이 캐시로 가져옵니다. 프로젝션은 SQL 파이프 라인에서 마지막으로 발생합니다.

처리의 투영 부분은 집계 생성과 관련 될 수 있으므로 마지막 (예 : GROUP BY 뒤)에 있어야합니다. 또한 JOIN, WHERE 및 ORDER BY 처리에는 많은 열이 필요할 수 있습니다. 결과 집합에서 최종적으로 반환되는 것보다 많은 열이 있습니다. 쿼리 계획에 단계를 추가하여 예상치 않게 I/O를 약간 절약 할 가치는 거의 없습니다.

쿼리 계획 문서를 확인하십시오. 쿼리 계획에는 "프로젝트"노드가 없습니다. 그것은 결과 집합을 공식화하는 작은 부분입니다.

"전체 행 가져 오기"에서 벗어나려면 기둥 형 ("반전 된") 데이터베이스로 가야합니다.

3

열의 수를 줄이면 쿼리의 속도에는 별 영향이 없지만 데이터 전송 속도에는 잠재적으로 더 큰 영향을 미칩니다. 선택한 데이터가 적을수록 와이어를 통해 애플리케이션으로 전송해야하는 데이터가 줄어 듭니다.

4

내가 질문을 오해,하지만 여기 어쨌든 이동 될 수 있습니다

당신이 커다란 차이를 만들지는 않습니다 열 선택의 절대 . 그러나 중 어떤 테이블을 선택하는지에 따라 중요한 차이를 만들 수 있습니다. 컬럼을 선택할 수 있습니다.

인덱스가 적용되는 열만 선택하면 DB 엔진은 테이블 데이터를 가져 오지 않고 쿼리의 인덱스 만 사용할 수 있습니다. 하나의 컬럼을 사용하더라도 커버리지가 없다면 전체 로우를 가져 와야합니다 (키 룩업). 그러면 성능이 크게 떨어집니다. 때로는 DB 엔진이 색인으로 괴롭히지 않고 전체 검사를 수행하기 위해 성능을 너무 많이 죽일 수도 있습니다. 선택되는 행 수에 따라 다 (니다.

따라서 열을 제거하여이를 처리 질의로 전환 한 다음 예를 선택하면 성능이 향상 될 수 있습니다. 그렇지 않으면 아마도 그렇지 않습니다. 어쨌든 눈에 띄게 없습니다.

SQL 서버 2005 +에 대한

빠른 예 -이 테이블의 말을 할 수 있습니다 :

ID int NOT NULL IDENTITY PRIMARY KEY CLUSTERED, 
Name varchar(50) NOT NULL, 
Status tinyint NOT NULL 

우리는이 인덱스를 작성하는 경우 :

CREATE INDEX IX_MyTable 
ON MyTable (Name) 

그런 다음이 쿼리가 빠르게 될 것입니다 :

SELECT ID 
FROM MyTable 
WHERE Name = 'Aaron' 

하지만이 쿼리는 느려질 것입니다 :

DB를 엔진은 결코 행을 읽을 필요가 없기 때문에

CREATE INDEX IX_MyTable 
ON MyTable (Name) 
INCLUDE (Status) 

그런 다음 두 번째 쿼리 빨리 다시하게 즉 우리가 커버링 인덱스로 인덱스를 변경하는 경우

SELECT ID, Name, Status 
FROM MyTable 
WHERE Name = 'Aaron' 

.

+1

+1이 발생할 수 있습니다. – SQLMenace

0

처리 할 서버 (MySQL의 경우 스토리지 엔진)에 따라 다를 수 있습니다. 예를 들어 행 단위 저장소 대신 열 단위 저장소를 수행하는 적어도 하나의 MySQL 저장소 엔진이 있으며이 경우 더 많은 열이 실제로 더 많은 시간이 소요될 수 있습니다.

다른 주요한 가능성은 테이블을 분할하여 일부 열이 한 서버에 저장되고 다른 열이 다른 열에 저장되도록하는 것입니다 (수직 분할이라고도 함). 이 경우 더 많은 열을 검색하려면 여러 서버에서 데이터를 검색하는 것이 필요할 수 있으며 부하가 불균형이어서 서버마다 응답 시간이 다를 수 있습니다. 물론 부하를 합리적으로 균형있게 유지하려고 시도하지만 상당히 이상하게 여겨야하지만 여전히 가능합니다 (특히 서버 중 하나가 사용량이 다른 나머지 데이터를 처리하는 경우).

0

예, 쿼리가 비 클러스터형 인덱스로 처리 될 수있는 경우 모든 데이터가 이미 인덱스에 있고 기본 테이블 (힙이있는 경우) 또는 클러스터형 인덱스를 건드릴 필요가 없으므로 쿼리가 더 빨라집니다 최적화 도구로

0

tvanfosson이 이미 작성한 것을 증명하기 위해 "전송"비용이 있다는 것을 입증하기 위해 쿼리 분석기의 MSSQL 2000 DB에서 다음 두 명령문을 실행했습니다. syscomments의 FROM

SELECT 데이터 길이 (텍스트) syscomments의

FROM

SELECT 텍스트는 모두 결과는 947 개 행을 반환하지만 첫 번째는 5ms의 두 번째 973 밀리했다.

또한 필드가 동일하기 때문에 인덱싱을 고려하지 않아도됩니다.

관련 문제