열 집합 사용Use Column Sets

이 항목은 다음에 적용됩니다. 예SQL Server(2016부터)예Azure SQL Database예Azure SQL Data Warehouse 예병렬 데이터 웨어하우스 THIS TOPIC APPLIES TO: yesSQL Server (starting with 2016)yesAzure SQL DatabaseyesAzure SQL Data Warehouse yesParallel Data Warehouse

스파스 열을 사용하는 테이블에서는 테이블의 모든 스파스 열을 반환하는 열 집합을 지정할 수 있습니다.Tables that use sparse columns can designate a column set to return all sparse columns in the table. 열 집합은 구조화된 출력으로 테이블의 모든 스파스 열을 결합하는 형식화되지 않은 XML 표현입니다.A column set is an untyped XML representation that combines all the sparse columns of a table into a structured output. 열 집합은 열 집합이 테이블에 물리적으로 저장되지 않는다는 점에서 계산 열과 유사하며,A column set is like a calculated column in that the column set is not physically stored in the table. 직접 업데이트할 수 있다는 점에서 계산 열과 다릅니다.A column set differs from a calculated column in that the column set is directly updatable.

테이블의 열 수가 많고 이러한 열을 개별적으로 작업하는 것이 복잡한 경우 열 집합을 사용하는 것이 좋습니다.You should consider using column sets when the number of columns in a table is large, and operating on them individually is cumbersome. 응용 프로그램에서 열이 많은 테이블의 열 집합을 사용하여 데이터를 선택하고 삽입하는 경우 성능이 약간 향상될 수도 있습니다.Applications might see some performance improvement when they select and insert data by using column sets on tables that have lots of columns. 그러나 테이블의 열에 많은 인덱스가 정의되어 있는 경우 열 집합의 성능이 저하될 수 있습니다.However, the performance of column sets can be reduced when many indexes are defined on the columns in the table. 왜냐하면 실행 계획에 필요한 메모리 양이 늘어나기 때문입니다.This is because the amount of memory that is required for an execution plan increases.

열 집합을 정의하려면 CREATE TABLE 또는 ALTER TABLE 문에 FOR ALL_SPARSE_COLUMNS 키워드를 사용합니다.To define a column set, use the FOR ALL_SPARSE_COLUMNS keywords in theCREATE TABLE or ALTER TABLE statements.

열 집합 사용 지침Guidelines for Using Column Sets

열 집합을 사용하는 경우 다음 지침을 고려합니다.When you use column sets, consider the following guidelines:

  • 스파스 열 및 열 집합을 동일한 문의 일부로 추가할 수 있습니다.Sparse columns and a column set can be added as part of the same statement.

  • 테이블에 스파스 열이 이미 포함되어 있는 경우 해당 테이블에 열 집합을 추가할 수 없습니다.A column set cannot be added to a table if that table already contains sparse columns.

  • 열 집합은 변경할 수 없습니다.The column set cannot be changed. 열 집합을 변경하려면 스파스 열 및 열 집합을 삭제한 다음 다시 만들어야 합니다.To change a column set, you must delete and re-create the sparse columns and the column set.

  • 스파스 열을 포함하지 않는 테이블에 열 집합을 추가할 수 있습니다.A column set can be added to a table that does not include any sparse columns. 스파스 열이 나중에 테이블에 추가되면 열 집합에 표시됩니다.If sparse columns are later added to the table, they will appear in the column set.

  • 테이블당 열 집합 하나만 허용됩니다.Only one column set is allowed per table.

  • 열 집합은 선택 사항이며 스파스 열을 사용하지 않아도 됩니다.A column set is optional and is not required to use sparse columns.

  • 열 집합에 제약 조건 또는 기본값을 정의할 수 없습니다.Constraints or default values cannot be defined on a column set.

  • 계산 열은 열 집합 열을 포함할 수 없습니다.Computed columns cannot contain column set columns.

  • 열 집합을 포함하는 테이블에서는 분산 쿼리가 지원되지 않습니다.Distributed queries are not supported on tables that contain column sets.

  • 복제는 열 집합을 지원하지 않습니다.Replication does not support column sets.

  • 변경 데이터 캡처에서 열 집합을 지원하지 않습니다.Change data capture does not support column sets.

  • 열 집합은 어떠한 인덱스 종류의 일부도 될 수 없습니다.A column set cannot be part of any kind of index. 여기에는 XML 인덱스, 전체 텍스트 인덱스 및 인덱싱된 뷰가 포함됩니다.This includes XML indexes, full-text indexes, and indexed views. 열 집합은 인덱스의 포괄 열로 추가될 수 없습니다.A column set cannot be added as an included column in any index.

  • 열 집합은 필터링된 인덱스 또는 필터링된 통계의 필터 식에 사용할 수 없습니다.A column set cannot be used in the filter expression of a filtered index or filtered statistics.

  • 뷰에 열 집합이 포함되어 있으면 열 집합이 뷰에서 XML 열로 표시됩니다.When a view includes a column set, the column set appears in the view as an XML column.

  • 열 집합은 인덱싱된 뷰 정의에 포함될 수 없습니다.A column set cannot be included in an indexed view definition.

  • 열 집합을 포함하는 테이블이 있는 분할 뷰가 이름별로 스파스 열을 지정하면 해당 분할 뷰를 업데이트할 수 있습니다.Partitioned views that include tables that contain column sets are updatable when the partitioned view specifies the sparse columns by name. 분할 뷰가 열 집합을 참조하면 해당 분할 뷰를 업데이트할 수 없습니다.A partitioned view is not updatable when it references the column set.

  • 열 집합을 참조하는 쿼리 알림은 허용되지 않습니다.Query notifications that refer to column sets are not permitted.

  • XML 데이터의 크기 제한이 2GB입니다.XML data has a size limit of 2 GB. 행에서 Null이 아닌 모든 스파스 열의 결합된 데이터가 이 제한을 초과하면 쿼리 또는 DML 작업에서 오류가 발생합니다.If the combined data of all the nonnull sparse columns in a row exceeds this limit, the query or DML operation will produce an error.

  • COLUMNS_UPDATED 함수에서 반환되는 데이터에 대한 자세한 내용은 스파스 열 사용을 참조하세요.For information about the data that is returned by the COLUMNS_UPDATED function, see Use Sparse Columns.

열 집합 데이터 선택 지침Guidelines for Selecting Data from a Column Set

열 집합에서 데이터를 선택하는 경우 다음 지침을 고려합니다.Consider the following guidelines for selecting data from a column set:

  • 이론적으로 열 집합은 기본 관계형 열 집합을 단일 XML 표현으로 집계하는 업데이트 가능 XML 계산 열 유형입니다.Conceptually, a column set is a type of updatable, computed XML column that aggregates a set of underlying relational columns into a single XML representation. 열 집합은 ALL_SPARSE_COLUMNS 속성만 지원합니다.The column set only supports the ALL_SPARSE_COLUMNS property. 이 속성은 특정 행에 대해 모든 스파스 열의 Null이 아닌 값을 모두 집계하는 데 사용됩니다.This property is used to aggregate all nonnull values from all sparse columns for a particular row.

  • SQL Server Management StudioSQL Server Management Studio 테이블 편집기에서 열 집합은 편집할 수 있는 XML 필드로 표시됩니다.In the SQL Server Management StudioSQL Server Management Studio table editor, column sets are displayed as an editable XML field. 열 집합을 다음 형식으로 정의합니다.Define column sets in the format:

    <column_name_1>value1</column_name_1><column_name_2>value2</column_name_2>...  
    

    열 집합 값의 예는 다음과 같습니다.Examples of column set values are as follows:

    • <sparseProp1>10</sparseProp1><sparseProp3>20</sparseProp3>

    • <DocTitle>Bicycle Parts List</DocTitle><Region>West</Region>

  • Null 값을 포함하는 스파스 열은 열 집합에 대한 XML 표현에서 생략됩니다.Sparse columns that contain null values are omitted from the XML representation for the column set.

경고

열 집합을 추가하면 SELECT * 쿼리 동작이 변경됩니다.Adding a column set changes the behavior of SELECT * queries. 쿼리는 열 집합을 XML 열로 반환하며 개별 스파스 열을 반환하지 않습니다.The query will return the column set as an XML column and not return the individual sparse columns. 스키마 디자이너 및 소프트웨어 개발자는 기존 응용 프로그램에서 오류가 발생하지 않도록 주의해야 합니다.Schema designers and software developers must be careful not to break existing applications.

열 집합에서 데이터 삽입 또는 수정Inserting or Modifying Data in a Column Set

개별 열 이름을 사용하거나 열 집합의 XML 형식을 통해 열 집합의 이름을 참조하고 열 집합의 값을 지정하여 스파스 열의 데이터 조작 작업을 수행할 수 있습니다.Data manipulation of a sparse column can be performed by using the name of the individual columns, or by referencing the name of the column set and specifying the values of the column set by using the XML format of the column set. 스파스 열은 XML 열에서 어떤 순서로도 표시될 수 있습니다.Sparse columns can appear in any order in the XML column.

XML 열 집합을 사용하여 스파스 열 값을 삽입하거나 업데이트하는 경우 기본 스파스 열에 삽입된 값은 xml 데이터 형식에서 암시적으로 변환됩니다.When sparse column values are inserted or updated by using the XML column set, the values that are inserted into the underlying sparse columns are implicitly converted from the xml data type. 숫자 열의 경우 XML 숫자 열에 있는 빈 값이 빈 문자열로 변환됩니다.In the case of numeric columns, a blank value in the XML for the numeric column converts to an empty string. 이로 인해 다음 예에서처럼 0이 숫자 열에 삽입됩니다.This causes a zero to be inserted into the numeric column as shown in the following example.

CREATE TABLE t (i int SPARSE, cs xml column_set FOR ALL_SPARSE_COLUMNS);  
GO  
INSERT t(cs) VALUES ('<i/>');  
GO  
SELECT i FROM t;  
GO  

이 예에서는 열 i에 값이 지정되지 않았지만 값 0 이 삽입되었습니다.In this example, no value was specified for the column i, but the value 0 was inserted.

sql_variant 데이터 형식 사용Using the sql_variant Data Type

sql_variant 데이터 형식은 int, chardate와 같은 여러 다른 데이터 형식을 저장할 수 있습니다.The sql_variant date type can store multiple different data types, such as int, char, and date. 열 집합은 sql_variant 값에 연결된 소수 자릿수, 전체 자릿수 및 로캘 정보와 같은 데이터 형식 정보를 생성된 XML 열에서 특성으로 출력합니다.Column sets output the data type information such as scale, precision, and locale information that is associated with a sql_variant value as attributes in the generated XML column. 사용자 지정하여 생성된 XML 문에 있는 이러한 특성을 열 집합의 삽입 또는 업데이트 작업에 대한 입력으로 제공하려는 경우에는 이 특성 중 일부가 필요하여 이러한 일부 특성에 기본값이 할당됩니다.If you try to provide these attributes in a custom-generated XML statement as an input for an insert or update operation on a column set, some of these attributes are required and some of them are assigned a default value. 다음 표에서는 데이터 형식과 값이 제공되지 않은 경우 서버에서 생성하는 기본값을 나열합니다.The following table lists the data types and the default values that the server generates when the value is not provided.

데이터 형식Data type localeIDlocaleID sqlCompareOptionssqlCompareOptions sqlCollationVersionsqlCollationVersion SqlSortIdSqlSortId 최대 길이Maximum length 전체 자릿수Precision 소수 자릿수Scale
char, varchar, binarychar, varchar, binary -1-1 '기본값''Default' 00 00 80008000 해당 사항 없음Not applicable 해당 사항 없음Not applicable
nvarcharnvarchar -1-1 '기본값''Default' 00 00 40004000 해당 사항 없음Not applicable 해당 사항 없음Not applicable
decimal, float, realdecimal, float, real 해당 사항 없음Not applicable 해당 사항 없음Not applicable 해당 사항 없음Not applicable 해당 사항 없음Not applicable 해당 사항 없음Not applicable 1818 00
integer, bigint, tinyint, smallintinteger, bigint, tinyint, smallint 해당 사항 없음Not applicable 해당 사항 없음Not applicable 해당 사항 없음Not applicable 해당 사항 없음Not applicable 해당 사항 없음Not applicable 해당 사항 없음Not applicable 해당 사항 없음Not applicable
datetime2datetime2 해당 사항 없음Not applicable 해당 사항 없음Not applicable 해당 사항 없음Not applicable 해당 사항 없음Not applicable 해당 사항 없음Not applicable 해당 사항 없음Not applicable 77
datetime offsetdatetime offset 해당 사항 없음Not applicable 해당 사항 없음Not applicable 해당 사항 없음Not applicable 해당 사항 없음Not applicable 해당 사항 없음Not applicable 해당 사항 없음Not applicable 77
datetime, date, smalldatetimedatetime, date, smalldatetime 해당 사항 없음Not applicable 해당 사항 없음Not applicable 해당 사항 없음Not applicable 해당 사항 없음Not applicable 해당 사항 없음Not applicable 해당 사항 없음Not applicable 해당 사항 없음Not applicable
money, smallmoneymoney, smallmoney 해당 사항 없음Not applicable 해당 사항 없음Not applicable 해당 사항 없음Not applicable 해당 사항 없음Not applicable 해당 사항 없음Not applicable 해당 사항 없음Not applicable 해당 사항 없음Not applicable
timetime 해당 사항 없음Not applicable 해당 사항 없음Not applicable 해당 사항 없음Not applicable 해당 사항 없음Not applicable 해당 사항 없음Not applicable 해당 사항 없음Not applicable 77

* localeID -1은 기본 로캘을 의미합니다.* localeID -1 means the default locale. 영어 로캘은 1033입니다.The English locale is 1033.

** 해당 사항 없음 = 열 집합에서 선택 작업을 수행하는 동안 이 특성에 대해 값이 출력되지 않습니다.** Not applicable = No values are output for these attributes during a select operation on the column set. 삽입 또는 업데이트 작업에서 열 집합에 대해 제공된 XML 표현의 호출자에 의해 이 특성에 대한 값이 지정된 경우 오류를 생성합니다.Generates an error when a value is specified for this attribute by the caller in the XML representation provided for a column set in an insert or update operation.

보안Security

열 집합에 대한 보안 모델은 테이블과 열 사이에 존재하는 보안 모델과 유사하게 작동합니다.The security model for a column set works similar to the security model that exists between table and columns. 열 집합은 미니 테이블로 시각화할 수 있으며 선택 작업은 이 미니 테이블에 대한 SELECT * 작업과 유사합니다.Column sets can be visualized as a minitable and a select operation is like a SELECT * operation on this minitable. 그러나 스파스 열에 대한 열 집합 간 관계는 엄격히 말해 컨테이너가 아닌 그룹화 관계입니다.But, the relationship between column set to sparse columns is a grouping relationship instead of strictly a container. 보안 모델은 열 집합 열의 보안을 검사하고 기본 스파스 열의 DENY 작업을 인식합니다.The security model checks the security on the column set column, and honors the DENY operations on the underlying sparse columns. 보안 모델에는 다음과 같은 추가 특징이 있습니다.Additional characteristics of the security model are as follows:

  • 보안 권한은 테이블에 있는 다른 모든 열과 유사하게 열 집합 열에서 부여되고 취소될 수 있습니다.Security permissions can be granted and revoked from the column set column, similar to any other column in the table.

  • 열 집합 열에 대한 SELECT, INSERT, UPDATE, DELETE 및 REFERENCES 권한의 GRANT 또는 REVOKE가 해당 집합의 기본 멤버 열로 전파되지 않습니다.A GRANT or REVOKE of SELECT, INSERT, UPDATE, DELETE, and REFERENCES permission on a column set column does not propagate to the underlying member columns of that set. 이는 열 집합 열을 사용하는 경우에만 적용됩니다.It applies only to the usage of the column set column. 열 집합에 대한 DENY 권한은 테이블의 기본 스파스 열로 전파되지 않습니다.DENY permission on a column set does propagate to the underlying sparse columns of the table.

  • 열 집합 열에 대해 SELECT, INSERT, UPDATE 및 DELETE 문을 실행하려면 사용자가 열 집합 열에 해당하는 권한은 물론 테이블의 모든 스파스 열에 해당하는 권한을 가지고 있어야 합니다.Executing SELECT, INSERT, UPDATE, and DELETE statements on the column set column require that the user has corresponding permissions on the column set column, and also the corresponding permission on all the sparse columns in the table. 열 집합은 테이블의 모든 스파스 열을 나타내므로 사용자가 변경하지 않으려는 스파스 열을 포함한 모든 스파스 열에 대한 권한을 가지고 있어야 합니다.Because the column set represents all the sparse columns in the table, you must have permission on all the sparse columns, and this includes sparse columns that you might not be changing.

  • 스파스 열 또는 열 집합에 대해 REVOKE 문을 실행하면 보안이 기본값인 해당 부모 개체의 보안으로 되돌려집니다.Executing a REVOKE statement on a sparse column or column set defaults the security to their parent object.

Examples

다음 예의 Document 테이블에는 DocIDTitle열의 공통 집합이 포함되어 있습니다.In the following examples, a document table contains the common set of columns DocID and Title. Production 그룹은 모든 생산 문서에 대한 ProductionSpecificationProductionLocation 열을 원하며,The Production group wants a ProductionSpecification and ProductionLocation column for all production documents. Marketing 그룹은 마케팅 문서에 대한 MarketingSurveyGroup 열을 원합니다.The Marketing group wants a MarketingSurveyGroup column for marketing documents.

1.A. 열 집합을 포함하는 테이블 만들기Creating a table that has a column set

다음 예에서는 스파스 열을 사용하고 열 집합 SpecialPurposeColumns를 포함하는 테이블을 만듭니다.The following example creates the table that uses sparse columns and includes the column set SpecialPurposeColumns. 이 예에서는 테이블에 두 개의 행을 삽입한 다음 테이블에서 데이터를 선택합니다.The example inserts two rows into the table, and then selects data from the table.

참고

이 테이블에는 테이블을 보다 잘 표시하고 읽을 수 있도록 열이 5개만 있습니다.This table has only five columns to make it easier to display and read.

USE AdventureWorks2012;  
GO  

CREATE TABLE DocumentStoreWithColumnSet  
    (DocID int PRIMARY KEY,  
     Title varchar(200) NOT NULL,  
     ProductionSpecification varchar(20) SPARSE NULL,  
     ProductionLocation smallint SPARSE NULL,  
     MarketingSurveyGroup varchar(20) SPARSE NULL,  
     MarketingProgramID int SPARSE NULL,  
     SpecialPurposeColumns XML COLUMN_SET FOR ALL_SPARSE_COLUMNS);  
GO  

2.B. 스파스 열 이름을 사용하여 테이블에 데이터 삽입Inserting data to a table by using the names of the sparse columns

다음 예에서는 예 1에서 만든 테이블에 두 개의 행을 삽입합니다. 이 예에서는 스파스 열 이름을 사용하고 열 집합을 참조하지 않습니다.The following examples insert two rows into the table that is created in example A. The examples use the names of the sparse columns and do not reference the column set.

INSERT DocumentStoreWithColumnSet (DocID, Title, ProductionSpecification, ProductionLocation)  
VALUES (1, 'Tire Spec 1', 'AXZZ217', 27);  
GO  

INSERT DocumentStoreWithColumnSet (DocID, Title, MarketingSurveyGroup)  
VALUES (2, 'Survey 2142', 'Men 25 - 35');  
GO  

3.C. 열 집합 이름을 사용하여 테이블에 데이터 삽입Inserting data to a table by using the name of the column set

다음 예에서는 예 1에서 만든 테이블에 세 번째 행을 삽입합니다. 이 예에서는 스파스 열 이름이 사용되지 않습니다.The following example inserts a third row into the table that is created in example A. This time the names of the sparse columns are not used. 대신 열 집합 이름이 사용되고 삽입 작업으로 인해 XML 형식의 스파스 열 4개 중 2개에 대한 값이 제공됩니다.Instead, the name of the column set is used, and the insert provides the values for two of the four sparse columns in XML format.

INSERT DocumentStoreWithColumnSet (DocID, Title, SpecialPurposeColumns)  
VALUES (3, 'Tire Spec 2', '<ProductionSpecification>AXW9R411</ProductionSpecification><ProductionLocation>38</ProductionLocation>');  
GO  

4.D. SELECT *가 사용되는 경우의 열 집합 결과 관찰Observing the results of a column set when SELECT * is used

다음 예에서는 열 집합을 포함하는 테이블의 모든 열을 선택합니다.The following example selects all the columns from the table that contains a column set. 이 예에서는 스파스 열의 조합 값과 함께 XML 열을 반환하며It returns an XML column with the combined values of the sparse columns. 스파스 열을 개별적으로 반환하지 않습니다.It does not return the sparse columns individually.

SELECT DocID, Title, SpecialPurposeColumns FROM DocumentStoreWithColumnSet ;  

결과 집합은 다음과 같습니다.Here is the result set.

DocID Title SpecialPurposeColumns

1 Tire Spec 1 <ProductionSpecification>AXZZ217</ProductionSpecification><ProductionLocation>27</ProductionLocation>

2 Survey 2142 <MarketingSurveyGroup>Men 25 - 35</MarketingSurveyGroup>

3 Tire Spec 2 <ProductionSpecification>AXW9R411</ProductionSpecification><ProductionLocation>38</ProductionLocation>

5.E. 이름별로 열 집합을 선택한 결과 관찰Observing the results of selecting the column set by name

Production 부서는 마케팅 데이터에 관심이 없으므로 이 예에서는 WHERE 절을 추가하여 출력을 제한합니다.Because the Production department is not interested in the marketing data, this example adds a WHERE clause to restrict the output. 이 예에서는 열 집합 이름을 사용합니다.The example uses the name of the column set.

SELECT DocID, Title, SpecialPurposeColumns  
FROM DocumentStoreWithColumnSet  
WHERE ProductionSpecification IS NOT NULL ;  

결과 집합은 다음과 같습니다.Here is the result set.

DocID Title SpecialPurposeColumns

1 Tire Spec 1 <ProductionSpecification>AXZZ217</ProductionSpecification><ProductionLocation>27</ProductionLocation>

3 Tire Spec 2 <ProductionSpecification>AXW9R411</ProductionSpecification><ProductionLocation>38</ProductionLocation>

6.F. 이름별로 스파스 열을 선택한 결과 관찰Observing the results of selecting sparse columns by name

테이블에 열 집합이 포함되어 있으면 다음 예에서처럼 개별 열 이름을 사용하여 테이블을 쿼리할 수 있습니다.When a table contains a column set, you can still query the table by using the individual column names as shown in the following example.

SELECT DocID, Title, ProductionSpecification, ProductionLocation   
FROM DocumentStoreWithColumnSet  
WHERE ProductionSpecification IS NOT NULL ;  

결과 집합은 다음과 같습니다.Here is the result set.

DocID Title ProductionSpecification ProductionLocation

1 Tire Spec 1 AXZZ217 27

3 Tire Spec 2 AXW9R411 38

7.G. 열 집합을 사용하여 테이블 업데이트Updating a table by using a column set

다음 예에서는 해당 행에서 사용하는 스파스 열 모두에 대해 세 번째 레코드를 새 값으로 업데이트합니다.The following example updates the third record with new values for both sparse columns that are used by that row.

UPDATE DocumentStoreWithColumnSet  
SET SpecialPurposeColumns = '<ProductionSpecification>ZZ285W</ProductionSpecification><ProductionLocation>38</ProductionLocation>'  
WHERE DocID = 3 ;  
GO  
중요

열 집합을 사용하는 UPDATE 문은 테이블의 모든 스파스 열을 업데이트합니다.An UPDATE statement that uses a column set updates all the sparse columns in the table. 참조되지 않는 스파스 열은 NULL로 업데이트됩니다.Sparse columns that are not referenced are updated to NULL.

다음 예에서는 세 번째 레코드를 업데이트하지만 채워진 두 열 중 하나의 값만 지정합니다.The following example updates the third record, but only specifies the value of one of the two populated columns. 세 번째 열 ProductionLocationUPDATE 문에 포함되지 않으며 NULL로 업데이트됩니다.The second column ProductionLocation is not included in the UPDATE statement and is updated to NULL.

UPDATE DocumentStoreWithColumnSet  
SET SpecialPurposeColumns = '<ProductionSpecification>ZZ285W</ProductionSpecification>'  
WHERE DocID = 3 ;  
GO  

참고 항목See Also

스파스 열 사용Use Sparse Columns