2011-01-24 1 views
4

이 질문이 너무 분명하지 않기를 바란다 ... 이미 실행 계획을 해석하는 데 유용한 정보를 많이 찾았지만 대답을 찾지 못한 질문이 하나있다.스키마 또는 데이터 또는 둘 다를 기반으로 한 SQL 실행 계획이 있습니까?

스키마에만 기반한 계획 (구체적으로 상대 CPU 비용) 또는 현재 데이터베이스에있는 실제 데이터가 있습니까?

필자는 제품 데이터베이스에 색인이 필요한 부분에 대한 분석을 시도하지만 현장에있는 제품의 데이터 양에 거의 미치지 않는 자체 테스트 시스템으로 작업하고 있습니다. 색인을 추가 한 후 실제로 약간의 CPU 비용이 올라간다는 것과 같은 이상한 일들을보고 있습니다. 내 데이터 세트가 너무 작기 때문에 이것이 궁금합니다.

SQL Server 2005 및 Management Studio를 사용하여 계획을 수행 중입니다.

+1

특히 데이터베이스가 있습니까? 그들은 모두 똑같은 것을 처리하지는 않습니다. –

답변

4

스키마와 데이터를 기반으로합니다. 스키마는 사용 가능한 인덱스를 알려주며, 데이터는 더 나은 인덱스를 알려줍니다.

답변은 사용하고있는 DBMS에 따라 조금씩 바뀔 수 있지만 (명시하지는 않았지만) 색인에 대한 통계를 유지하므로 색인이 도움이되는지 여부를 알 수 있습니다. 인덱스가 1000 개의 행을 900 개의 별개 값으로 나누면 사용할 수있는 좋은 인덱스입니다. 인덱스가 1000 개의 행에 대해 3 개의 다른 값을 얻는 경우 실제로는 selective이 아니므로별로 유용하지 않습니다.

1

스키마와 데이터 모두.

쿼리 계획을 작성할 때 통계를 고려하여 쿼리의 각 단계에서 반환되는 행 수를 대략적으로 계산합니다 (다른 조인 유형 등의 성능에 영향을 미칠 수 있음).

이 좋은 예는이 상황에서 테이블 스캔을 수행하는 것이 더 빠르기 때문에 매우 작은 테이블에서 인덱스를 사용하는 것을 귀찮게하지 않는다는 것입니다.

1

나는 모든 RDBMS 시스템을 말할 수는 없지만, Postgres는 쿼리 계획을 세우기위한 노력의 일환으로 추정 된 테이블 크기를 사용합니다. 예를 들어, 테이블에 두 개의 행이있는 경우 해당 테이블을 사용하는 JOIN 부분에 대해 순차 테이블 검색을 선택할 수 있지만 10000 개 이상의 행이있는 경우 인덱스 또는 해시 검색을 사용하도록 선택할 수 있습니다 (둘 중 하나 덧붙여서 VIEW의 예상 크기가 없으므로 실제 테이블 대신 VIEW를 결합하여 Postgres에서 잘못된 쿼리 계획을 트리거 할 수있었습니다.

Postgres가 쿼리 계획을 구성하는 방법의 일부는 구성 파일의 튜너 블 매개 변수에 따라 다릅니다. Postgres가 어떻게 쿼리 계획을 구성하는지에 대한 자세한 정보는 Postgres 웹 사이트에서 찾을 수 있습니다.

+0

VIEW는 일반적으로 계획하기 전에 SQL 쿼리에서 확장되므로 일반적으로 뷰에 필요한 통계가 없습니다. – araqnid

0

SQL Server의 경우 최종 실행 계획에 기여하는 요인은 다양합니다. 기본적인 수준에서 통계는 매우 큰 역할을하지만 데이터를 기반으로하지만 항상 모든 데이터를 기반으로하는 것은 아닙니다. 통계도 항상 최신 정보는 아닙니다. 인덱스를 만들거나 다시 작성할 때 통계는 전체/100 % 데이터 샘플을 기반으로해야합니다. 그러나 자동 통계 새로 고침의 샘플 속도는 100 %보다 훨씬 낮으므로 실제로 많은 데이터를 나타내지 않는 범위를 샘플링 할 수 있습니다. 예상되는 행 수는 테이블의 행 수나 필터링 된 조작에 대한 통계를 기반으로 할 수 있습니다. 따라서 오래된 (또는 불완전한) 통계는 테이블의 일부 행이 인덱스를 완전히 무시하게 (더 효율적일 수 있음)하는 것처럼 최적화 프로그램이 최적화되지 않은 계획을 선택하도록 유도 할 수 있습니다. 다른 대답에서 언급 된 바와 같이,보다 고유 한 (즉,선택적) 데이터가 더 유용 할 것입니다. 그러나 통계가있는 유일한 보장 된 열은 색인의 선행 (또는 "가장 왼쪽"또는 "첫 번째") 열임을 명심하십시오. SQL Server는 AutoCreateStatistics DB 옵션이 설정되어 있고 기본적으로 다른 열에 대한 통계를 수집 할 수 있습니다 (일부 인덱스가 아닐지라도 일부 인덱스 포함).

외부 키의 존재는 해당 필드가 쿼리에있을 때 옵티 마이저를 도울 수 있습니다.

그러나 질문에서 고려되지 않은 영역 중 하나는 쿼리 자체의 영역입니다. 약간 변경되었지만 여전히 동일한 결과를 반환하는 쿼리는 근본적으로 다른 실행 계획을 가질 수 있습니다. 이상적으로 (작업이 읽기 명심 지금

WHERE DATEADD(DAY, -1, field) < GETDATE() 

: 같은

LIKE '%' + field 

또는 함수에서 필드 포장 : 사용하여 인덱스의 사용을 무효화 할 수도 있습니다)를 사용하면 인덱스가 더 빠르지 만 인덱스는 유지해야하므로 DML 작업 (INSERT, UPDATE 및 DELETE)은 느려집니다 (더 많은 CPU 및 디스크 I/O 사용).

마지막으로 비용의 "추정 된"CPU 등 값은 항상 신뢰할 수있는 것은 아닙니다.

SET STATISTICS IO ON 
run query 
SET STATISTICS IO OFF 

과 "논리적 읽기"에 초점 : 더 나은 테스트하는 것입니다. 논리 읽기를 줄이면 성능이 향상됩니다.

결국 인덱스와 쿼리 자체에 대해 성능을 조정하기 위해 프로덕션 환경에 어느 정도 가까운 데이터 집합이 필요합니다.

0

오라클 세부 사항 :

명시된 비용은 실제로 추정 실행 시간이지만,이 블록 읽기에 대한 예상 시간과 관련이있다 측정의 다소 모호한 단위로 주어진다. 옵티 마이저에 의한 각 추정치가 100 % 완벽하지 않은 경우 (단, 절대 해당하지 않음) 계산 된 비용이 런타임에 대해서는별로 중요하지 않다는 것을 인식하는 것이 중요합니다.

옵티마이 저는 쿼리에 적용 할 수있는 변환/휴리스틱을 결정할 때 많은 것을 스키마로 사용합니다. xplans 평가할 때 많은 문제 스키마 것들의 예 :

  • 외래 키 제약
  • 파티션 (테이블 elimiation 사용할 수 있습니다) 대 독특한
  • 고유 제한 조건 (지수 (전체 데이터의 범위를 제외) 예를 들어 범위 스캔)
  • 하지 널 제약 (과 함께 사용할 수 없습니다 안티 조인 NOT IN() 널 (NULL) 컬럼에
  • 데이터 유형 (유형 변환, 전문 날짜를 arithmetics)
  • Materializ
  • 차원 계층 구조 (집계에 대해 쿼리를 재 작성을위한) 에드 뷰는
  • 확인 제약 (
  • 인덱스 유형 (B- 트리 (제약 조건이 비용을 절감 경우 주입() 함수 종속을 결정하는)?), 비트 맵, 함수
  • 열 순서 지수 (a = 1의 {A, B} = 범위 주사에, {B, A} = 주사 이동 또는 FFS)를 추정

코어) 기반 합류 실제 데이터 (또는 조리 된 데이터)에 수집 된 통계를 사용하는 데 있습니다. 통계는 테이블, 열, 인덱스, 파티션 및 기타 다른 항목에 대해 수집됩니다.

다음과 같은 정보가 수집됩니다 :

  • 수 (Nr) 행의 테이블/파티션에
  • 평균 행/
  • 수 (전체 스캔, 해시 조인, 종류, 임시 테이블 원가 계산을위한 중요한) COL 길이
  • col (姓이 매우 고유하지 않음)
  • col의 최소/최대 값와 같은 제한되지 않은 범위 조건을 지원합니다. (is_president = 'Y'는 매우 고유합니다.)

... 데이터 필터링시 예상되는 행 수/바이트 수를 예측하는 데 도움이됩니다. 이 정보는 사용 가능한 액세스 경로와 결합 메? 니즘을 판별하는 데 사용되며 SQL 조회의 실제 값이 통계와 비교할 때 적절합니다. 모두의 상단에

도 전체 테이블 스캔 대 될 인덱스 방법 "좋은"또는 매력에 영향을 미치는 물리적 인 행 순서가있다. 인덱스의 경우이를 "클러스터링 요소"라고하며 행 순서와 인덱스 항목의 순서가 일치하는 정도를 측정합니다.

2

SQL 서버는 100 % 비용 기반 최적화 프로그램입니다. 다른 RDBMS 옵티 마이저는 일반적으로 비용 기반 및 규칙 기반의 혼합이지만 SQL Server는 더 좋거나 나쁘지 만 전적으로 비용 중심입니다. 규칙 기반 옵티 마이저는 예를 들어 과 같이 말할 수 있습니다. FROM 절의 테이블 순서에 따라 조인의 운전 테이블이 결정됩니다.. SQL Server에는 이러한 규칙이 없습니다. SQL Statement Processing 참조 :

SQL Server 쿼리 최적화 프로그램은 비용 기반 최적화 프로그램입니다. 가능한 각각의 실행 계획은 리소스 사용량 측면에서 관련 비용이 입니다. 쿼리 최적화 이 가능한 계획을 분석하고 가장 낮은 추정 비용으로 하나를 선택해야합니다. 일부 복잡한 SELECT 문에는 수천 개의 실행 계획이 수립 가능합니다. 이러한 경우 쿼리 최적화 프로그램은 모든 가능한 조합을 분석하지 않습니다. 대신, 최소 의 비용을 합리적으로 가까운 비용 이있는 실행 계획을 찾기 위해 복잡한 알고리즘을 사용합니다.

SQL Server 쿼리 최적화 프로그램은 리소스 비용이 가장 낮은 실행 계획 만 선택하지 않습니다. 그것은 는 자원의 합리적인 비용으로 사용자에게 결과 반환 계획을 선택하고 그 가장 빠른 결과를 반환합니다. 예를 들어, 병렬 질의 처리는 통상 직렬 그것을 처리보다 리소스를 사용하지만 빠르게 조회를 완료한다. SQL Server 최적화 프로그램은 병렬 실행 계획을 사용하여 서버로드가 에 악영향을주지 않으면 결과를 반환합니다.

질의 옵티마이 테이블 인덱스에서 정보를 추출 다른 방법의 자원 비용 추정 분산 통계에 의존한다. 열과 인덱스에 대한 분산 통계가 유지됩니다. 값은 특정 인덱스 또는 열의 값 선택 범위 인 을 나타냅니다. 의 경우 자동차를 나타내는 테이블에서 많은 자동차가 동일한 제조업체 인 을 가지고 있지만 각 차량에는 고유 한 차량 식별 번호 (VIN)가 있습니다. VIN의 색인은 제조업체의 색인보다 더 선택적입니다. 인덱스 통계가 최신이 아닌 경우 쿼리 최적화 프로그램이 테이블의 현재 상태를 가장 잘 나타내지 않을 수 있습니다. 에 대한 자세한 내용은 Using Statistics to Improve Query Performance을 참조하십시오.

관련 문제