Loading

사용자 지정 색인을 사용하여 SOQL 쿼리 성능 개선

게시 일자: Jun 3, 2024
상세 설명

성능을 극대화하려면 SOQL 쿼리, 특히 트리거 내부 쿼리가 선택적이어야 합니다. 긴 실행 시간을 방지하기 위해 비선택적 SOQL 쿼리를 시스템이 종료할 수 있습니다. 트리거의 비선택적 쿼리가 200,000개보다 많은 레코드가 포함된 개체에 대해 실행되면 개발자가 오류 메시지를 수신합니다. 아래에서 이 오류를 방지하고 쿼리를 선택적으로 만드는 방법에 대해 알아보십시오. 
솔루션

중요 참고사항: 

이 문서에서는 Salesforce SOQL Query Optimizer 가 어떻게 작동하는지를 높은 수준에서 설명하기 위해 노력하고 있으나, 추가적인 성능 향상에 대응하기 위해 Query Optimizer 의 동작은 예고 없이 변경될 수 있습니다. 개발자는 영향을 받는 SOQL 쿼리에 대한 쿼리 플랜이 생성되는 시점에 Query Optimizer 가 제공하는 정보를 토대로 비선택적 쿼리를 조정할 수 있도록 쿼리 플랜 보기('14년 여름부터 사용 가능)을 사용하는 것이 좋습니다.

또한 색인이 DML에 비용을 추가하고(거나) 때로는 색인에 따라 Query Optimizer가 다르게 동작해야 하므로 성능에 영향을 미칠 수도 있습니다.



선택적 SOQL 쿼리 조건


쿼리 필터 중 하나가 색인된 필드에 대한 것이고, 해당 필터로 인해 결과 행 수가 시스템에서 정의한 임계값 아래로 줄어들면 선택적인 쿼리입니다. WHERE 절에 사용된 두 개 이상의 필터가 언급된 조건을 충족하면 SOQL 쿼리 성능이 개선됩니다.

선택적 SOQL 이 되기 위한 임계값은 첫 백만건의 레코드에 대해서는 레코드 수의 10%, 첫 백만 레코드 이후는 레코드 수의 5% 이며, 최대 333,000 건의 레코드까지가 대상입니다.
일부 경우에는, 예를 들어 쿼리 필터에서 사용되는 필드가 색인된 표준 필드일 경우, 선택적 SOQL 이 되기 위한 임계값은 더 높을 수 있습니다.
또한 이 선택적 SOQL 이 되기 위한 임계값은 향후 변경될 수 있습니다.



선택적 SOQL 쿼리의 사용자 지정 색인 관련 고려 사항

다음 필드는 기본적으로 색인화됩니다.

  • 기본 키(ID, 이름 및 소유자 필드).
  • 외래 키(룩업 또는 마스터-세부 사항 관계 필드).
  • 감사 날짜(SystemModStamp 등). 
  • 외부 ID 또는 고유로 표시된 사용자 지정 필드.

       

Salesforce 지원 팀은 고객이 요청할 경우 사용자 지정 색인을 추가할 수 있습니다.

지원 사례를 작성할 때 WHERE 절의 필터에 색인화할 필드가 있는 SOQL 쿼리를 사례에 포함해주셔야 합니다.
또한 WHERE 절 필터의 값에 변수를 설정하여 동적으로 변경되는 경우, 고정된 특정 값으로 지정하여 주시길 바랍니다.
지원 사례를 만들기 전에 SOQL 쿼리를 선택적 쿼리로 만들기의 체크리스트를 살펴보십시오.
SOQL 쿼리를 선택적 쿼리로 만드는 방법을 참조하고 개발자 콘솔에서 쿼리 플랜 분석을 쿼리 플랜 도구에 언급된 대로 수행하여 색인 가능한 필드를 확인할 수도 있습니다. 
발생 빈도가 가장 낮은 확인란 필드 값의 사용자 지정 색인이 성능에 가장 유리하고, 일반적으로 선택적 쿼리임을 나타냅니다.  

다음 필드 유형에는 사용자 지정 색인을 만들 수 없습니다.

  • 다중 선택 선택 목록.
  • 다중통화 조직의 통화 필드.
  • 긴 텍스트 필드. 
  • 바이너리 필드(blob, 파일 또는 암호화된 텍스트 유형의 필드). 

참고: 일반적으로 복잡한 새로운 데이터 유형이 Salesforce에 추가될 수 있고, 이런 유형의 필드에는 사용자 지정 색인이 허용되지 않을 수 있습니다.
       

사용자 지정 색인은 일반적으로 다음과 같은 경우에 사용되지 않습니다.

  • 쿼리된 값이 위에 언급된 시스템 정의 임계값을 초과하는 경우.
  • 필터 연산자가 NOT EQUAL TO(또는 !=), NOT CONTAINS 및 NOT STARTS WITH 같은 부정 연산자인 경우.
  • CONTAINS 연산자가 필터에 사용되고 스캔할 행 수가 333,000개보다 많은 경우. CONTAINS 연산자를 사용하려면 색인 전체 스캔이 요구되기 때문입니다. 이 임계값은 바뀔 수 있습니다.
  • 비어 있는 값과 비교하는 경우(Name != '').

참고: 사용자 지정 색인이 사용되지 않는 다른 복잡한 시나리오가 더 있습니다. 시나리오가 이런 사례로 지원되지 않거나 비선택적 쿼리에 대한 도움이 더 필요한 경우 Salesforce 담당자에게 문의하십시오.



선택적 SOQL 쿼리의 예

큰 개체에 대한 쿼리가 선택적인지에 대한 이해를 높이기 위해, 몇 가지 쿼리를 분석해 보겠습니다. 이런 쿼리에 대해, 여기서는 계정 sObject에 대한 레코드(아직 휴지통에 있는 삭제된 레코드인 일시 삭제된 레코드 포함)가 200,000개보다 많다고 가정합니다.


쿼리 1:

SELECT Id FROM Account WHERE Id IN (<list of account IDs>)

WHERE 절은 색인된 필드(Id)에 있습니다. SELECT COUNT() FROM Account WHERE Id IN (<list of account IDs>)에서 선택력 임계값보다 적은 수의 레코드를 반환하는 경우 Id의 색인이 사용됩니다. ID 목록에는 소량의 레코드만 포함되므로, 이런 경우가 일반적입니다.


쿼리 2:

SELECT Id FROM Account WHERE Name != ''

Name이 색인되어도(기본 키) Account는 큰 개체이므로, 이 필터는 대부분의 레코드를 반환하여 쿼리가 비선택적 쿼리가 됩니다.

 

쿼리 3:

SELECT Id FROM Account WHERE Name != '' AND CustomField__c = 'ValueA'

여기서는 각 필터가 개별적으로 고려되는 경우 선택적인지 확인해야 합니다. 이전 예에서 본 것처럼 첫 번째 필터는 선택적이지 않습니다. 따라서 두 번째 필터에 초점을 맞추겠습니다. SELECT COUNT() FROM Account WHERE CustomField__c = 'ValueA'에서 반환하는 레코드 수가 선택력 임계값보다 적고 CustomField__c가 색인된 경우, 쿼리는 선택적입니다.

쿼리 4:

SELECT Id FROM Account WHERE FormulaField__c = 'ValueA'
공식 필드를 색인하기 위해서는 다음 규칙이 참이어야 합니다.
  • 공식에 개체 하나의 (관계 필드가 아닌) 필드만 포함되어 있음.
  • 공식 필드에서 비결정적 함수(예: SYSDATE)를 참조하지 않음.
  • DATEVALUE(Date/Time 필드)의 값을 참조하는 수식은 색인을 만들 수 없음.
  • 공식 필드에서 지원되지 않는 필드를 색인에 포함시키기 위해 참조하지 않음. 이 목록은 어디에도 구체적으로 문서화되어 있지 않지만(특수 사례가 많이 있음), 12년 봄(176)에는 createdById가 지원되지 않았으나 12년 여름(178)에는 지원되었습니다. CreatedDate도 마찬가지입니다.
  • 공식 필드에 기본 키(예: Id)에 대한 참조가 포함되어 있지 않음 
  • 공식 필드에서 TEXT(<picklist-field>) 함수를 사용하지 않음
  • 공식에서 룩업 필드를 참조하는 경우, 필드의 "룩업 레코드가 삭제되면 수행할 작업" 옵션이 "이 필드의 값 지우기"로 설정되어 있지 않아야 함.

 

참고: SOQL 쿼리의 성능을 Salesforce 지원 팀에서 분석하고, 기준에 합격하면 색인이 수행됩니다.

Knowledge 기사 번호

000385213

 
로드 중
Salesforce Help | Article