검색 최적화로 부분 문자열 및 정규 표현식 쿼리 속도 향상

검색 최적화로 부분 문자열 및 정규 표현식 쿼리 속도 향상

검색 최적화는 텍스트 또는 반정형 데이터에서 부분 문자열을 검색하거나 정규 표현식을 사용하는 조건부가 있는 쿼리의 성능을 향상시킬 수 있습니다. 부분 문자열 검색이 반정형 데이터에서 어떻게 작동하는지에 대한 자세한 내용은 검색 최적화로 반정형 데이터 쿼리 속도 향상 을 참고하세요.

다음 섹션은 부분 문자열 및 정규 표현식 쿼리에 대한 검색 최적화 지원에 대한 자세한 정보를 제공합니다.

출처: Snowflake 문서

본문

부분 문자열 및 정규 표현식 쿼리에 대한 검색 최적화 활성화

테이블에서 부분 문자열 및 정규 표현식 쿼리의 성능을 향상시키려면 특정 열에 대해 ALTER TABLE … ADD SEARCH OPTIMIZATION 명령의 ON SUBSTRING 절 을 사용하세요.

예를 들어:

ALTER TABLE mytable ADD SEARCH OPTIMIZATION ON SUBSTRING(mycol);

자세한 내용은 검색 최적화 활성화 및 비활성화 를 참고하세요.

지원되는 조건부

검색 최적화 서비스는 다음을 사용하는 조건부가 있는 쿼리의 성능을 향상시킬 수 있습니다.

검색 최적화 서비스는 길이가 5자 이상인 부분 문자열을 검색할 때 성능을 향상시킬 수 있습니다. (더 선택적인 부분 문자열은 더 나은 성능을 낼 수 있습니다.) 검색 최적화 서비스는 부분 문자열이 5자 미만이므로 다음 조건부에 대해 검색 액세스 경로를 사용하지 않습니다.

LIKE '%TEST%'

다음 조건부에서 검색 최적화 서비스는 SEARCH와 OPTIMIZED의 부분 문자열을 검색하는 검색 액세스 경로를 사용해 이 쿼리를 최적화할 수 있습니다. 그러나 IS는 5자 미만이므로 검색 액세스 경로가 사용되지 않습니다.

LIKE '%SEARCH%IS%OPTIMIZED%'

텍스트에 대해 RLIKE, REGEXP, REGEXP_LIKE를 사용하는 쿼리의 경우:

  • subject 인자는 검색 최적화가 활성화된 테이블의 TEXT 열이어야 합니다.
  • pattern 인자는 문자열 상수여야 합니다.

정규 표현식의 경우 검색 최적화 서비스는 다음 경우에 가장 잘 작동합니다.

  • 패턴에 길이가 5자 이상인 부분 문자열 리터럴이 하나 이상 포함되어 있는 경우.
  • 패턴이 부분 문자열이 적어도 한 번 나타나야 한다고 지정하는 경우.

예를 들어 다음 패턴은 string이 subject에 한 번 이상 나타나야 한다고 지정합니다.

RLIKE '(string)+'

검색 최적화 서비스는 각 조건부가 5자 이상의 부분 문자열이 적어도 한 번 나타나야 한다고 지정하므로 다음 패턴이 있는 쿼리의 성능을 향상시킬 수 있습니다. (첫 번째 예시는 백슬래시 문자를 이스케이프하지 않기 위해 달러 따옴표 문자열 상수 를 사용합니다.)

RLIKE $$.*email=[\w\.]+@snowflake\.com.*$$
RLIKE '.*country=(Germany%France%Spain).*'
RLIKE '.*phone=[0-9]{3}-?[0-9]{3}-?[0-9]{4}.*'

대조적으로 검색 최적화는 다음 패턴이 있는 쿼리에 대해 검색 액세스 경로를 사용하지 않습니다.

  • 부분 문자열이 전혀 없는 패턴:
RLIKE '.*[0-9]{3}-?[0-9]{3}-?[0-9]{4}.*'
  • 5자 미만의 부분 문자열만 포함하는 패턴:
RLIKE '.*tel=[0-9]{3}-?[0-9]{3}-?[0-9]{4}.*'
  • 하나의 옵션이 5자 미만의 부분 문자열인 선택(alternation) 연산자를 사용하는 패턴:
RLIKE '.*(option1%option2%opt3).*'
  • 부분 문자열이 선택적인(optional) 패턴:
RLIKE '.*[a-zA-z]+(string)?[0-9]+.*'

부분 문자열 리터럴이 5자 미만이어도, 정규 표현식을 확장하면 길이가 5자 이상인 부분 문자열 리터럴이 생성되는 경우 검색 최적화 서비스는 여전히 쿼리 성능을 향상시킬 수 있습니다.

예를 들어 다음 패턴을 고려해 보세요.

.*st=(CA%AZ%NV).*(-->){2,4}.*

이 예시에서:

  • 부분 문자열 리터럴(예: st=, CA 등)이 5자 미만이지만, 검색 최적화 서비스는 st=CA, st=AZ, 또는 st=NV(각각 5자 길이) 부분 문자열이 텍스트에 나타나야 함을 인식합니다.
  • 마찬가지로 부분 문자열 리터럴 -->가 5자 미만이어도, 검색 최적화 서비스는 5자보다 긴 -->--> 부분 문자열이 텍스트에 나타나야 한다고 판단합니다.

검색 최적화 서비스는 검색 액세스 경로를 사용해 이러한 부분 문자열을 매칭할 수 있으며, 이는 쿼리의 성능을 향상시킬 수 있습니다.

더 알아보기 (Learn more)