검색 최적화로 텍스트 쿼리 속도 향상
검색 최적화로 텍스트 쿼리 속도 향상
검색 최적화는 SEARCH 및 SEARCH_IP 함수를 사용하는 쿼리의 성능을 향상시킬 수 있습니다. 이러한 쿼리는 하나 이상의 테이블에서 지정된 열의 문자 데이터(텍스트)와 IP 주소를 검색하며, VARIANT, OBJECT, ARRAY 열의 요소를 포함합니다.
다음 섹션은 텍스트 쿼리에 대한 검색 최적화 지원에 대한 자세한 정보를 제공합니다.
출처: Snowflake 문서
본문
텍스트 쿼리에 대한 검색 최적화 활성화
테이블에서 텍스트 쿼리의 성능을 향상시키려면 특정 열에 대해 ALTER TABLE … ADD SEARCH OPTIMIZATION 명령의 ON FULL_TEXT 절 을 사용하세요. 테이블 수준에서 검색 최적화를 활성화해도 SEARCH 또는 SEARCH_IP 함수를 사용하는 쿼리에서는 활성화되지 않습니다.
예를 들어:
ALTER TABLE lines ADD SEARCH OPTIMIZATION
ON FULL_TEXT(play, character, line);
자세한 내용은 검색 최적화 활성화 및 비활성화 를 참고하세요.
FULL_TEXT 검색 최적화의 런타임 사용 조건
SEARCH 함수로 쿼리되는 테이블에서 FULL_TEXT 검색 최적화를 활성화한 후에는 최적화를 위한 검색 액세스 경로가 쿼리 계획 및 실행 중에 사용될 수 있습니다. 다음 조건이 충족되어야 합니다.
- 검색 최적화가 사용할 준비가 되어 있어야 합니다 (DESCRIBE SEARCH OPTIMIZATION 출력에서
active열 = TRUE). - 검색 최적화가 SEARCH 조건부에 지정된 열의 상위 집합(superset)에서 활성화되어야 합니다. 예를 들어 테이블에 VARCHAR 열
c1,c2,c3,c4,c5가 포함되어 있고, 검색 최적화가 열c1,c2,c3을 커버하며, 함수가 그 열 중 하나, 둘, 또는 세 개를 검색한다면(c4또는c5는 제외), 쿼리는 FULL_TEXT 검색 최적화의 혜택을 받을 수 있습니다. - ALTER TABLE 명령에서 검색 최적화에 대해 정의된 분석기(analyzer)가 SEARCH 함수 호출에 지정된 분석기와 동일해야 합니다.
팁
쿼리에 특정 검색 액세스 경로가 사용되었는지 알아보려면 쿼리 프로필에서 Search Optimization Access 노드를 찾으세요.
ADD (및 DROP) FULL_TEXT 검색 최적화 예시
다음 예시는 SEARCH 함수가 그 열들을 쿼리하는 데 사용될 때 쿼리 성능을 향상시키기 위해 테이블의 열에서 FULL_TEXT 검색 최적화를 활성화하는 방법을 보여줍니다.
특정 분석기로 FULL_TEXT 검색 최적화 활성화
다음 예시는 한 열에 FULL_TEXT 검색 최적화를 활성화하고 분석기를 지정합니다. 최적화 유형과 분석기(method)의 조합이 DESCRIBE 출력에 반영됩니다.
ALTER TABLE lines ADD SEARCH OPTIMIZATION
ON FULL_TEXT(line, ANALYZER => 'UNICODE_ANALYZER');
DESCRIBE SEARCH OPTIMIZATION ON lines;
+---------------+----------------------------+--------+------------------+--------+
| expression_id | method | target | target_data_type | active |
|---------------+----------------------------+--------+------------------+--------|
| 1 | FULL_TEXT UNICODE_ANALYZER | LINE | VARCHAR(2000) | true |
+---------------+----------------------------+--------+------------------+--------+
같은 열에 기본 분석기로 FULL_TEXT 검색 최적화를 활성화하면 DESCRIBE 출력이 두 행을 반환하고 표현식 ID와 method로 두 항목을 구분합니다.
ALTER TABLE lines ADD SEARCH OPTIMIZATION
ON FULL_TEXT(line);
DESCRIBE SEARCH OPTIMIZATION ON lines;
+---------------+----------------------------+--------+------------------+--------+
| expression_id | method | target | target_data_type | active |
|---------------+----------------------------+--------+------------------+--------|
| 1 | FULL_TEXT UNICODE_ANALYZER | LINE | VARCHAR(2000) | true |
| 2 | FULL_TEXT DEFAULT_ANALYZER | LINE | VARCHAR(2000) | false |
+---------------+----------------------------+--------+------------------+--------+
VARIANT 열에 FULL_TEXT 검색 최적화 활성화
다음 명령은 VARIANT 열에 FULL_TEXT 검색 최적화를 활성화합니다. (이 car_sales 테이블과 그 데이터는 반정형 데이터 쿼리 에 설명되어 있습니다.)
ALTER TABLE car_sales ADD SEARCH OPTIMIZATION
ON FULL_TEXT(src);
DESCRIBE SEARCH OPTIMIZATION ON car_sales;
+---------------+----------------------------+--------+------------------+--------+
| expression_id | method | target | target_data_type | active |
|---------------+----------------------------+--------+------------------+--------|
| 1 | FULL_TEXT DEFAULT_ANALYZER | SRC | VARIANT | true |
+---------------+----------------------------+--------+------------------+--------+
OBJECT 열에 FULL_TEXT 검색 최적화 활성화
다음 예시는 OBJECT 열에 FULL_TEXT 검색 최적화를 활성화합니다.
먼저 OBJECT 열이 있는 테이블을 만들고 데이터를 삽입하세요.
CREATE OR REPLACE TABLE so_object_example (object_column OBJECT);
INSERT INTO so_object_example (object_column)
SELECT OBJECT_CONSTRUCT('a', 1::VARIANT, 'b', 2::VARIANT);
다음 명령은 OBJECT 열에 FULL_TEXT 검색 최적화를 활성화합니다.
ALTER TABLE so_object_example ADD SEARCH OPTIMIZATION
ON FULL_TEXT(object_column);
DESCRIBE SEARCH OPTIMIZATION ON so_object_example;
+---------------+----------------------------+---------------+------------------+--------+
| expression_id | method | target | target_data_type | active |
|---------------+----------------------------+---------------+------------------+--------|
| 1 | FULL_TEXT DEFAULT_ANALYZER | OBJECT_COLUMN | OBJECT | true |
+---------------+----------------------------+---------------+------------------+--------+
ARRAY 열에 FULL_TEXT 검색 최적화 활성화
다음 예시는 ARRAY 열에 FULL_TEXT 검색 최적화를 활성화합니다.
먼저 ARRAY 열이 있는 테이블을 만들고 데이터를 삽입하세요.
CREATE OR REPLACE TABLE so_array_example (array_column ARRAY);
INSERT INTO so_array_example (array_column)
SELECT ARRAY_CONSTRUCT('a', 'b', 'c');
다음 명령은 ARRAY 열에 FULL_TEXT 검색 최적화를 활성화합니다.
ALTER TABLE so_array_example ADD SEARCH OPTIMIZATION
ON FULL_TEXT(array_column);
DESCRIBE SEARCH OPTIMIZATION ON so_array_example;
+---------------+----------------------------+--------------+------------------+--------+
| expression_id | method | target | target_data_type | active |
|---------------+----------------------------+--------------+------------------+--------|
| 1 | FULL_TEXT DEFAULT_ANALYZER | ARRAY_COLUMN | ARRAY | true |
+---------------+----------------------------+--------------+------------------+--------+
하나 이상의 열에서 FULL_TEXT 최적화 드롭
여러 열에서 FULL_TEXT 최적화를 활성화한 다음 그 열 중 하나 이상에서 최적화를 드롭할 수 있습니다. 나머지 열은 여전히 최적화됩니다.
ALTER TABLE lines ADD SEARCH OPTIMIZATION
ON FULL_TEXT(play, act_scene_line, character, line, ANALYZER => 'UNICODE_ANALYZER');
DESCRIBE SEARCH OPTIMIZATION ON lines;
+---------------+----------------------------+----------------+------------------+--------+
| expression_id | method | target | target_data_type | active |
|---------------+----------------------------+----------------+------------------+--------|
| 1 | FULL_TEXT UNICODE_ANALYZER | PLAY | VARCHAR(50) | true |
| 2 | FULL_TEXT UNICODE_ANALYZER | ACT_SCENE_LINE | VARCHAR(10) | true |
| 3 | FULL_TEXT UNICODE_ANALYZER | CHARACTER | VARCHAR(30) | true |
| 4 | FULL_TEXT UNICODE_ANALYZER | LINE | VARCHAR(2000) | true |
+---------------+----------------------------+----------------+------------------+--------+
ALTER TABLE lines DROP SEARCH OPTIMIZATION ON 1, 2, 3;
DESCRIBE SEARCH OPTIMIZATION ON lines;
+---------------+----------------------------+--------+------------------+--------+
| expression_id | method | target | target_data_type | active |
|---------------+----------------------------+--------+------------------+--------|
| 4 | FULL_TEXT UNICODE_ANALYZER | LINE | VARCHAR(2000) | true |
+---------------+----------------------------+--------+------------------+--------+
와일드카드(*)를 사용해 모든 적격 열에서 검색 최적화 활성화
다음 ALTER TABLE 명령은 lines 테이블의 네 개 VARCHAR 열 모두에 FULL_TEXT 검색 최적화를 활성화합니다.
ALTER TABLE lines ADD SEARCH OPTIMIZATION
ON FULL_TEXT(*);
DESCRIBE SEARCH OPTIMIZATION ON lines;
+---------------+----------------------------+----------------+------------------+--------+
| expression_id | method | target | target_data_type | active |
|---------------+----------------------------+----------------+------------------+--------|
| 1 | FULL_TEXT DEFAULT_ANALYZER | PLAY | VARCHAR(50) | true |
| 2 | FULL_TEXT DEFAULT_ANALYZER | ACT_SCENE_LINE | VARCHAR(10) | true |
| 3 | FULL_TEXT DEFAULT_ANALYZER | CHARACTER | VARCHAR(30) | true |
| 4 | FULL_TEXT DEFAULT_ANALYZER | LINE | VARCHAR(2000) | true |
+---------------+----------------------------+----------------+------------------+--------+
FULL_TEXT 최적화 활성화 시 예상 오류
다음 ALTER TABLE 명령은 지정된 열 중 하나가 NUMBER 열이므로 예상 오류와 함께 실패합니다.
ALTER TABLE lines ADD SEARCH OPTIMIZATION
ON FULL_TEXT(play, speech_num, act_scene_line, character, line);
001128 (42601): SQL compilation error: error line 1 at position 76
Expression FULL_TEXT(IDX_SRC_TABLE.SPEECH_NUM) cannot be used in search optimization.