Loading

개발자 콘솔 쿼리 플랜 도구 FAQ

게시 일자: Aug 30, 2024
상세 설명

개발자 콘솔의 쿼리 플랜 도구를 사용하면 대량으로 수행되는 SOQL 쿼리의 속도를 높일 수 있습니다. 쿼리 플랜 도구를 사용하여 대량으로 수행되는 쿼리를 최적화하고 속도를 높이십시오.

 

쿼리 플랜 도구 활성화 및 사용

  1. 개발자 콘솔에서 도움말 | 기본 설정을 클릭합니다.
  2. '쿼리 플랜 활성화'를 TRUE로 설정합니다.


쿼리 플랜 도구를 개발자 콘솔에서 활성화한 후 콘솔의 '쿼리 편집기' 탭에서 도구에 액세스할 수 있습니다.

쿼리 플랜 도구를 사용하려면 간단히 쿼리 편집기에서 쿼리를 입력하고 쿼리 플랜을 눌러 모든 쿼리 작업과 각각의 비용을 제공된 SOQL에 대해 표시합니다.

 
솔루션

쿼리 플랜 도구를 사용하는 이유

이 도구는 느리게 실행되는 SOQL 쿼리의 쿼리 플랜을 확인하기 위해 사용합니다. 이 도구를 사용하면 여러 플랜에 대한 통찰력을 얻고 몇몇 필터를 색인하는 경우 전체 테이블 스캔 비용과 비교한 색인 사용 비용을 확인할 수 있습니다.

테이블 스캔 비용이 색인 비용보다 낮고 쿼리 제한 시간이 초과되려고 하는 경우 선택력 개선을 위한 다른 필터 사용에 대해 더 분석하거나, 해당 쿼리에 색인되지 않았지만 색인 가능한 다른 선택적 필터가 있는지 더 분석해야 합니다.
 

필터가 선택적인지 확인:

  • 필터에 색인이 있는지 확인합니다.
  • 필터가 표준 필드에 있는 경우, 필터가 기본 키(ID, 이름, OwnerId), 외래 키(CreatedById, LastModifiedById, 룩업, 마스터-세부 사항 관계) 및 감사 필드(CreatedDate, SystemModstamp)인 경우 색인을 포함합니다.
  • 고유 또는 외부 ID로 표시된 사용자 지정 필드는 색인을 포함합니다.
  • 필터에 색인이 없으면 필터가 최적화 대상으로 고려되지 않습니다.
  • 필터에 색인이 있는 경우 레코드를 몇 개 반환할지 확인하십시오.
  • 표준 색인의 경우, 임계값은 첫 백만 개 레코드의 30퍼센트와 그 후 모든 레코드의 15퍼센트입니다. 또한 표준 색인의 최대 선택력 임계값은 총 대상 레코드 100만 개인데, 이 값에는 총 레코드 수가 560만 개보다 많아야만 도달할 수 있습니다.
  • 사용자 지정 색인의 경우, 선택력 임계값은 첫 백만 개 레코드의 10퍼센트와 그 후 모든 레코드의 5퍼센트입니다. 또한 사용자 지정 색인의 최대 선택력 임계값은 333,333개의 대상 레코드인데, 이 값에는 레코드 수가 560만 개보다 많아야만 도달할 수 있습니다.
  • 필터가 임계값을 초과하면 최적화 대상으로 고려되지 않습니다.
  • 필터가 임계값을 초과하지 않으면 이 필터는 선택적이고, Query Optimizer가 필터를 최적화 대상으로 고려합니다.
 

이 모든 내용은 무엇을 의미하나요?

쿼리 플랜 도구는 제공된 쿼리에 대해 Query Optimizer가 사용할 수 있는 가용 플랜의 비용이 오름차순으로 배열된 목록을 표시합니다.

각 플랜마다 카디널리티, 작업 유형, 비용, sObject 유형 등에 대한 정보가 포함됩니다. 각 플랜에는 예를 들어 필드 색인 또는 전체 테이블 스캔 같은 '선행 작업 유형'이 있습니다. 가장 비용이 낮은 플랜이 쿼리 실행에 사용됩니다.

 
카디널리티
필드
선행 작업 유형
비용
sObject 카디널리티
sObject 유형
선행 작업 유형에서 반환할 추정 레코드 수.
예: 색인 테이블을 사용하는 경우에 반환되는 레코드 수.
 
Query Optimizer가 사용하는 색인된 필드. 선행 작업 유형이 색인인 경우, 필드 값은 색인입니다. 그렇지 않으면 필드 값은 null입니다.
Salesforce가 쿼리를 최적화하기 위해 사용할 기본 작업 유형.
  • 색인 - 쿼리에서 색인을 쿼리된 개체에 사용합니다.
  • 공유 - 쿼리에서 쿼리를 실행하는 사용자와 연결된 공유 규칙에 따라 색인을 사용합니다. 사용자가 액세스할 수 있는 레코드를 제한하는 공유 규칙이 있는 경우, Salesforce가 해당 규칙을 사용해 쿼리를 최적화할 수 있습니다.
  • TableScan - 쿼리된 개체의 모든 레코드를 스캔합니다.
  • 기타 - 쿼리에서 Salesforce 내부 최적화를 사용합니다.
Force.com Query Optimizer의 선택력 임계값에 비교한 쿼리 비용입니다. 값이 1보다 크면 쿼리가 선택적이지 않음을 의미합니다.
쿼리된 개체의 대략적인 레코드 개수입니다.
쿼리된 개체의 이름입니다.
 

 

비용은 어떻게 결정되나요?

각 플랜마다 비용 값이 있습니다. 비용 값은 테이블 및 값에 대해 마지막으로 수집한 데이터베이스(DB) 통계에서 도출합니다. 비용이 가장 낮은 플랜이 사용됩니다. 비용이 1보다 크면 쿼리가 선택적이지 않음을 의미합니다.

 

색인된 필드가 플랜 목록에 표시되지 않음

입력한 쿼리의 필터에 색인된 필드가 포함된 경우, 해당 필드에 대해 지원되는 작업을 사용하는 경우에만 플랜이 필드에 대해 표시됩니다.

다음은 지원되지 않는 작업의 목록입니다.

  • "NOT EQUAL TO" 같은 연산자를 사용하여 비교하는 경우 사용자 지정 색인이 사용되지 않습니다.
  • "Name = ''" 같은 null 값을 사용하여 비교하는 경우 사용자 지정 색인이 사용되지 않습니다.
  • 선행 '%' 와일드카드는 비효율적인 연산자로, 필터 조건이 비선택적이 되게 하기도 합니다.
  • OR 비교를 사용하는 경우 모든 필터가 색인되고 10% 임계값 미만이어야 합니다. . 색인되지 않은 필드가 있거나 필드 하나가 10%를 초과하면 플랜이 표시되지 않습니다.

 

쿼리 플랜 도구에 색인 가능한 색인 후보 또는 필드가 표시되나요?

쿼리 플랜 도구는 색인 가능한 필드가 아닌 색인된 필드 통계만 플랜 섹션에 표시합니다. 이 도구는 색인 가능한 필드에 대한 정보를 제공하지 않습니다.

색인 가능한 필드 확인에 대해서는 내 SOQL 쿼리를 선택적인 쿼리로 만드는 방법을 참조하십시오.

 

쿼리 플랜 결과 해석의 예와 방법 

다음 예에서는 2개의 색인된 필드인 확인란 하나(InActiveAcc__c)와 선택 목록 하나(Account_Hierarchy__c)를 계정 sObject에 사용합니다.

참고: 이 새로운 개발자 콘솔 도구의 바탕이 된 쿼리 리소스 피드백 매개 변수 파일럿에 대한 원 게시물에서 쿼리의 예를 더 많이 확인할 수 있습니다.

 

쿼리 예 1

SELECT count() FROM Account WHERE Account_Hierarchy__c = 'Parent'


시나리오: 선택적인 바인딩 변수가 있는 색인된 필드

“Account_Hierarchy__c” 필드는 색인된 필드이므로 선행 작업 유형이 “색인”인 플랜에 고려되었습니다. 색인된 필드의 비용은 TableScan보다 낮으므로 색인이 이 쿼리의 Query Optimizer에서 50,088개의 행이 있는 계정 개체에 사용됩니다.

 

쿼리 예 2

SELECT count() FROM Account WHERE InActiveAcc__c = true AND Account_Hierarchy__c = 'Parent'


시나리오: 색인된 필드 2개, 선택적 필드 1개

2개 이상의 단순 필터가 선택적이면 어떻게 되나요? 2개 이상의 필터가 선택적인 필터인 것으로 확인되면 Query Optimizer에서 쿼리 실행 플랜을 추진하는 비용이 가장 낮은 필터를 선택합니다.

 

쿼리 예 3

SELECT count() FROM Account WHERE InActiveAcc__c = true AND Account_Hierarchy__c != 'Parent' **NOTE: Using unsupported operation on index**


시나리오: 색인된 필드 2개, 선택적이지만 지원되지 않는 연산을 사용하는 필드 1개

Account_Hierarchy__c의 색인은 지원되지 않은 연산 “!=” 때문에 사용 또는 고려되지 않습니다. InActiveAcc__c도 사용되지만 1보다 비용이 더 높습니다. 앞에서 언급했듯이, 이 필터는 선택적이지 않지만 사용됩니다.

 

쿼리 예 4

SELECT count() FROM Account WHERE Account_Hierarchy__c = 'Child'


시나리오: 비선택적인 바인딩 변수를 사용하는 색인된 필드 1개(sObject 행 수의 10% 초과)

여기서 색인된 필드 Account_Hierarchy__c의 비용은 전체 테이블 스캔보다 훨씬 더 높은 것으로 확인됩니다. 그 이유는 "Child" 바인딩 변수 사용 시 색인이 선택적이지 않아 전체 테이블의 10%를 넘기 때문입니다. DB는 이 쿼리에 대해 전체 테이블 스캔을 실행하므로, 전체 테이블 크기에 따라 성능이 저하될 수 있습니다.
Knowledge 기사 번호

000386864

 
로드 중
Salesforce Help | Article