다음을 통해 공유


CREATE SELECTIVE XML INDEX(Transact-SQL)

적용 대상: SQL ServerAzure SQL Database Azure SQL Managed Instance

지정한 테이블 및 XML 열에 새 선택적 XML 인덱스를 만듭니다. 선택적 XML 인덱스는 자주 쿼리하는 노드의 하위 집합만 인덱싱하여 XML 인덱싱 및 쿼리의 성능을 향상시킵니다. 또한 보조 선택적 XML 인덱스를 만들 수도 있습니다. 자세한 내용은 보조 선택적 XML 인덱스 만들기, 변경 및 삭제를 참조하세요.

Transact-SQL 구문 표기 규칙

구문

CREATE SELECTIVE XML INDEX index_name  
    ON <table_object> (xml_column_name)  
    [WITH XMLNAMESPACES (<xmlnamespace_list>)]  
    FOR (<promoted_node_path_list>)  
    [WITH (<index_options>)]  
  
<table_object> ::=  
 { database_name.schema_name.table_name | schema_name.table_name | table_name }  
  
<promoted_node_path_list> ::=   
<named_promoted_node_path_item> [, <promoted_node_path_list>]  
  
<named_promoted_node_path_item> ::=   
<path_name> = <promoted_node_path_item>  
  
<promoted_node_path_item>::=  
<xquery_node_path_item> | <sql_values_node_path_item>  
  
<xquery_node_path_item> ::=   
<node_path> [AS XQUERY <xsd_type_or_node_hint>] [SINGLETON]  
  
<xsd_type_or_node_hint> ::=   
[<xsd_type>] [MAXLENGTH(x)] | node()  
  
<sql_values_node_path_item> ::=  
<node_path> AS SQL <sql_type> [SINGLETON]  
  
<node_path> ::=   
character_string_literal  
  
<xsd_type> ::=   
character_string_literal  
  
<sql_type> ::=   
identifier  
  
<path_name> ::=   
identifier  
  
<xmlnamespace_list> ::=   
<xmlnamespace_item> [, <xmlnamespace_list>]  
  
<xmlnamespace_item> ::=   
<xmlnamespace_uri> AS <xmlnamespace_prefix>  
  
<xml_namespace_uri> ::=   
character_string_literal  
  
<xml_namespace_prefix> ::=   
identifier  
  
<index_options> ::=   
(   
  | PAD_INDEX  = { ON | OFF }  
  | FILLFACTOR = fillfactor  
  | SORT_IN_TEMPDB = { ON | OFF }  
  | IGNORE_DUP_KEY = OFF  
  | DROP_EXISTING = { ON | OFF }  
  | ONLINE = OFF  
  | ALLOW_ROW_LOCKS = { ON | OFF }  
  | ALLOW_PAGE_LOCKS = { ON | OFF }  
  | MAXDOP = max_degree_of_parallelism  
)  

인수

index_name
만들 새 인덱스의 이름입니다. 인덱스 이름은 테이블에서 고유해야 하지만 데이터베이스 내에서 고유할 필요는 없습니다. 인덱스 이름은 식별자 규칙을 따라야 합니다.

<table_object> 인덱싱할 XML 열이 포함된 테이블입니다. 다음 형식 중 하나를 사용합니다.

  • database_name.schema_name.table_name

  • database_name..table_name

  • schema_name.table_name

  • table_name

xml_column_name
인덱싱할 경로가 포함된 XML 열의 이름입니다.

[WITH XMLNAMESPACES (<xmlnamespace_list>)] 인덱싱할 경로에서 사용하는 네임스페이스의 목록입니다. WITH XMLNAMESPACES 절의 구문에 대한 자세한 내용은 WITH XMLNAMESPACES(Transact-SQL)를 참조하세요.

FOR (<promoted_node_path_list>) 선택적 최적화 힌트를 사용하여 인덱싱할 경로의 목록입니다. CREATE 또는 ALTER 문에 지정할 수 있는 경로 및 최적화 힌트에 대한 자세한 내용은 선택적 XML 인덱스에 대한 경로 및 최적화 힌트 지정을 참조하세요.

WITH <index_options> 인덱스 옵션에 대한 자세한 내용은 CREATE XML INDEX(선택적 XML 인덱스)를 참조하세요.

모범 사례

대부분의 경우 더 나은 성능과 더 효율적인 스토리지를 위해 일반 XML 인덱스 대신 선택적 XML 인덱스를 만듭니다. 그러나 다음 조건 중 하나에 해당하는 경우에는 선택적 XML 인덱스가 권장되지 않습니다.

  • 많은 수의 노드 경로를 매핑해야 하는 경우

  • 알 수 없는 위치에 있는 알 수 없는 요소에 대한 쿼리를 지원해야 하는 경우.

제한 사항

제한 사항에 대한 자세한 내용은 SXI(선택적 XML 인덱스)를 참조하세요.

보안

사용 권한

테이블이나 뷰에 대한 ALTER 권한이 필요합니다. 사용자는 sysadmin 고정 서버 역할의 멤버 또는 db_ddladmindb_owner 고정 데이터베이스 역할의 멤버여야 합니다.

예제

다음 예에서는 선택적 XML 인덱스를 만드는 구문을 보여 줍니다. 또한 이 예에서는 선택적 최적화 힌트를 사용하여 인덱싱할 경로를 설명하는 구문의 여러 변형도 보여 줍니다.

CREATE TABLE Tbl ( id INT PRIMARY KEY, xmlcol XML );  
GO  
CREATE SELECTIVE XML INDEX sxi_index  
ON Tbl(xmlcol)  
FOR(  
    pathab   = '/a/b' as XQUERY 'node()',  
    pathabc  = '/a/b/c' as XQUERY 'xs:double',   
    pathdtext = '/a/b/d/text()' as XQUERY 'xs:string' MAXLENGTH(200) SINGLETON,  
    pathabe = '/a/b/e' as SQL NVARCHAR(100)  
);  

다음 예에는 WITH XMLNAMESPACES 절이 포함되어 있습니다.

CREATE SELECTIVE XML INDEX on T1(C1)  
WITH XMLNAMESPACES ('https://www.tempuri.org/' as myns)  
FOR ( path1 = '/myns:book/myns:author/text()' );  

참고 항목

SXI(선택적 XML 인덱스)
선택적 XML 인덱스 만들기, 변경 및 삭제
선택적 XML 인덱스에 대한 경로 및 최적화 힌트 지정