Synapse SQL 풀의 테이블 디자인Design tables in Synapse SQL pool

이 문서에서는 SQL 풀의 테이블 디자인에 대 한 주요 소개 개념을 제공 합니다.This article provides key introductory concepts for designing tables in SQL pool.

테이블 범주 확인Determine table category

스타 스키마는 데이터를 팩트 및 차원 테이블로 구성합니다.A star schema organizes data into fact and dimension tables. 일부 테이블은 팩트 또는 차원 테이블로 이동하기 전의 통합 또는 준비 데이터에 사용됩니다.Some tables are used for integration or staging data before it moves to a fact or dimension table. 테이블을 디자인할 때 테이블 데이터가 팩트, 차원 또는 통합 테이블에 속하는지를 결정합니다.As you design a table, decide whether the table data belongs in a fact, dimension, or integration table. 이 결정은 적절한 테이블 구조 및 배포를 알려줍니다.This decision informs the appropriate table structure and distribution.

  • 팩트 테이블 은 트랜잭션 시스템에서 일반적으로 생성 된 다음 SQL 풀로 로드 되는 양적 데이터를 포함 합니다.Fact tables contain quantitative data that are commonly generated in a transactional system, and then loaded into the SQL pool. 예를 들어 소매 비즈니스는 매일 판매 트랜잭션을 생성 한 다음 분석을 위해 데이터를 SQL 풀 팩트 테이블로 로드 합니다.For example, a retail business generates sales transactions every day, and then loads the data into a SQL pool fact table for analysis.

  • 차원 테이블에는 변경될 수 있지만 일반적으로 드물게 변경되는 특성 데이터가 있습니다.Dimension tables contain attribute data that might change but usually changes infrequently. 예를 들어 고객의 이름과 주소는 차원 테이블에 저장되고, 고객 프로필이 변경될 때만 업데이트됩니다.For example, a customer's name and address are stored in a dimension table and updated only when the customer's profile changes. 큰 팩트 테이블의 크기를 최소화 하기 위해 고객의 이름과 주소가 팩트 테이블의 모든 행에 있을 필요는 없습니다.To minimize the size of a large fact table, the customer's name and address don't need to be in every row of a fact table. 대신, 팩트 테이블과 차원 테이블에서 고객 ID를 공유할 수 있습니다.Instead, the fact table and the dimension table can share a customer ID. 쿼리는 두 테이블을 조인하여 고객 프로필과 트랜잭션을 연결할 수 있습니다.A query can join the two tables to associate a customer's profile and transactions.

  • 통합 테이블에서는 데이터를 통합하거나 준비할 수 있습니다.Integration tables provide a place for integrating or staging data. 통합 테이블을 일반 테이블, 외부 테이블 또는 임시 테이블로 만들 수 있습니다.You can create an integration table as a regular table, an external table, or a temporary table. 예를 들어 준비 테이블에 데이터를 로드하고 준비 중인 데이터에 대한 변환을 수행한 다음 프로덕션 테이블에 데이터를 삽입할 수 있습니다.For example, you can load data to a staging table, perform transformations on the data in staging, and then insert the data into a production table.

스키마 및 테이블 이름Schema and table names

스키마는 비슷한 방식으로 함께 사용 되는 테이블을 그룹화 하는 좋은 방법입니다.Schemas are a good way to group tables, used in a similar fashion, together. 온-프레미스 솔루션에서 SQL 풀로 여러 데이터베이스를 마이그레이션하는 경우 모든 팩트, 차원 및 통합 테이블을 SQL 풀의 한 스키마로 마이그레이션하는 것이 가장 좋습니다.If you're migrating multiple databases from an on-prem solution to SQL pool, it works best to migrate all of the fact, dimension, and integration tables to one schema in SQL pool.

예를 들어 WideWorldImportersDW 샘플 SQL 풀의 모든 테이블을 wwi 라는 하나의 스키마 내에 저장할 수 있습니다.For example, you could store all the tables in the WideWorldImportersDW sample SQL pool within one schema called wwi. 다음 코드에서는 wwi 라는 사용자 정의 스키마 를 만듭니다.The following code creates a user-defined schema called wwi.

CREATE SCHEMA wwi;

SQL 풀에서 테이블의 조직을 표시 하려면 팩트, dim 및 int를 테이블 이름의 접두사로 사용할 수 있습니다.To show the organization of the tables in SQL pool, you could use fact, dim, and int as prefixes to the table names. 다음 표는 WideWorldImportersDW의 일부 스키마 및 테이블 이름을 보여 줍니다.The following table shows some of the schema and table names for WideWorldImportersDW.

WideWorldImportersDW 테이블WideWorldImportersDW table 테이블 유형입니다.Table type SQL 풀SQL pool
구/군/시City 차원Dimension wwi.DimCitywwi.DimCity
주문Order 팩트Fact wwi.FactOrderwwi.FactOrder

테이블 지속성Table persistence

테이블은 데이터를 Azure Storage Azure Storage에 영구적으로 저장 하거나 SQL 풀 외부의 데이터 저장소에 저장 합니다.Tables store data either permanently in Azure Storage, temporarily in Azure Storage, or in a data store external to SQL pool.

일반 테이블Regular table

일반 테이블은 SQL 풀의 일부로 Azure Storage에 데이터를 저장 합니다.A regular table stores data in Azure Storage as part of SQL pool. 세션이 열려 있는지 여부에 관계없이 테이블과 데이터가 지속됩니다.The table and the data persist regardless of whether a session is open. 다음 예에서는 두 개의 열이 있는 일반 테이블을 만듭니다.The following example creates a regular table with two columns.

CREATE TABLE MyTable (col1 int, col2 int );  

임시 테이블Temporary table

임시 테이블은 세션 기간 동안만 유지됩니다.A temporary table only exists for the duration of the session. 임시 테이블을 사용 하 여 다른 사용자가 임시 결과를 보지 못하도록 하거나 정리의 필요성을 줄일 수 있습니다.You can use a temporary table to prevent other users from seeing temporary results and also to reduce the need for cleanup.

임시 테이블은 로컬 저장소를 활용 하 여 빠른 성능을 제공 합니다.Temporary tables utilize local storage to offer fast performance. 자세한 내용은 임시 테이블을 참조하세요.For more information, see Temporary tables.

외부 테이블External table

외부 테이블은 Azure Storage Blob 또는 Azure Data Lake Store에 있는 데이터를 가리킵니다.An external table points to data located in Azure Storage blob or Azure Data Lake Store. CREATE TABLE SELECT 문과 함께 사용 하는 경우 외부 테이블에서 데이터를 선택 하면 SQL 풀로 데이터를 가져옵니다.When used in conjunction with the CREATE TABLE AS SELECT statement, selecting from an external table imports data into SQL pool.

따라서 외부 테이블은 데이터를 로드 하는 데 유용 합니다.As such, external tables are useful for loading data. 로드 자습서는 PolyBase를 사용 하 여 Azure blob storage에서 데이터 로드를참조 하세요.For a loading tutorial, see Use PolyBase to load data from Azure blob storage.

데이터 형식Data types

SQL 풀은 가장 일반적으로 사용 되는 데이터 형식을 지원 합니다.SQL pool supports the most commonly used data types. 지원되는 데이터 형식의 목록은 CREATE TABLE 문의 CREATE TABLE 참조의 데이터 형식을 참조하세요.For a list of the supported data types, see data types in CREATE TABLE reference in the CREATE TABLE statement. 데이터 형식 사용에 대한 지침은 데이터 형식을 참조하세요.For guidance on using data types, see Data types.

분산 테이블Distributed tables

Synapse SQL의 기본 기능은 배포를 통해 테이블에 저장 하 고 작업할 수 있는 방법입니다.A fundamental feature of Synapse SQL is the way it can store and operate on tables across distributions. Synapse SQL은 데이터를 배포 하는 세 가지 방법, 즉 라운드 로빈 (기본값), 해시 및 복제를 지원 합니다.Synapse SQL supports three methods for distributing data: round-robin (default), hash and replicated.

해시 분산 테이블Hash-distributed tables

해시 분산 테이블은 배포 열의 값에 따라 행을 배포 합니다.A hash distributed table distributes rows based on the value in the distribution column. 해시 분산 테이블은 큰 테이블의 쿼리에 대해 고성능을 얻기 위해 설계 되었습니다.A hash distributed table is designed to achieve high performance for queries on large tables. 배포 열을 선택할 때 고려해 야 할 몇 가지 요소가 있습니다.There are several factors to consider when choosing a distribution column.

자세한 내용은 분산 테이블에 대한 디자인 지침을 참조하세요.For more information, see Design guidance for distributed tables.

복제된 테이블Replicated tables

복제된 테이블에는 모든 컴퓨팅 노드에서 사용할 수 있는 테이블의 전체 복사본이 있습니다.A replicated table has a full copy of the table available on every Compute node. 복제 된 테이블에 대 한 조인은 데이터 이동이 필요 하지 않으므로 복제 된 테이블에서 쿼리가 빠르게 실행 됩니다.Queries run fast on replicated tables since joins on replicated tables don't require data movement. 복제에는 추가 저장소가 필요 하지만 대형 테이블에는 실용적이 지 않습니다.Replication requires extra storage, though, and isn't practical for large tables.

자세한 내용은 복제된 테이블에 대한 디자인 지침을 참조하세요.For more information, see Design guidance for replicated tables.

라운드 로빈 테이블Round-robin tables

라운드 로빈 테이블은 테이블 행을 모든 분산에서 균일하게 배포합니다.A round-robin table distributes table rows evenly across all distributions. 행은 무작위로 분산됩니다.The rows are distributed randomly. 라운드 로빈 테이블에 대한 데이터 로드는 빠릅니다.Loading data into a round-robin table is fast. 쿼리에는 다른 배포 방법 보다 더 많은 데이터 이동이 필요할 수 있습니다.Keep in mind that queries can require more data movement than the other distribution methods.

자세한 내용은 분산 테이블에 대한 디자인 지침을 참조하세요.For more information, see Design guidance for distributed tables.

테이블에 대한 일반적인 분산 방법Common distribution methods for tables

테이블 범주에 따라 선택할 테이블 배포 옵션이 결정되는 경우가 많습니다.The table category often determines which option to choose for distributing the table.

테이블 범주Table category 권장 배포 옵션Recommended distribution option
팩트Fact 클러스터형 columnstore 인덱스와 함께 해시 배포를 사용합니다.Use hash-distribution with clustered columnstore index. 동일한 배포 열에서 두 해시 테이블을 조인하면 성능이 향상됩니다.Performance improves when two hash tables are joined on the same distribution column.
차원Dimension 작은 테이블에는 복제를 사용합니다.Use replicated for smaller tables. 테이블이 너무 커서 각 컴퓨팅 노드에 저장할 수 없는 경우 해시 분산을 사용합니다.If tables are too large to store on each Compute node, use hash-distributed.
스테이징Staging 준비 테이블에는 라운드 로빈을 사용합니다.Use round-robin for the staging table. CTAS를 사용하면 빠르게 로드됩니다.The load with CTAS is fast. 데이터가 준비 테이블에 있으면 INSERT ...를 사용 합니다. 데이터를 프로덕션 테이블로 이동 하려면 선택 합니다.Once the data is in the staging table, use INSERT...SELECT to move the data to production tables.

테이블 파티션Table partitions

분할된 테이블은 데이터 범위에 따라 테이블 행에 저장하고 작업을 수행합니다.A partitioned table stores and performs operations on the table rows according to data ranges. 예를 들어 테이블을 일, 월 또는 연도별로 분할할 수 있습니다.For example, a table could be partitioned by day, month, or year. 쿼리 검색을 파티션 내의 데이터로 제한하는 파티션 제거를 통해 쿼리 성능을 향상시킬 수 있습니다.You can improve query performance through partition elimination, which limits a query scan to data within a partition. 파티션 전환을 통해 데이터를 유지 관리할 수도 있습니다.You can also maintain the data through partition switching. Azure Synapse Analytics의 데이터가 이미 배포 되었기 때문에 너무 많은 파티션이 쿼리 성능을 저하 시킬 수 있습니다.Since the data in Azure Synapse Analytics is already distributed, too many partitions can slow query performance. 자세한 내용은 분할 지침을 참조하세요.For more information, see Partitioning guidance. 비어 있지 않은 테이블 파티션으로 파티션이 전환 될 때 기존 데이터를 잘라낼 경우 ALTER table 문에 TRUNCATE_TARGET 옵션을 사용 하는 것이 좋습니다.When partition switching into table partitions that are not empty, consider using the TRUNCATE_TARGET option in your ALTER TABLE statement if the existing data is to be truncated. 아래 코드는 변환 된 매일 데이터를 기존 데이터를 덮어쓰는 SalesFact로 전환 합니다.The below code switches in the transformed daily data into the SalesFact overwriting any existing data.

ALTER TABLE SalesFact_DailyFinalLoad SWITCH PARTITION 256 TO SalesFact PARTITION 256 WITH (TRUNCATE_TARGET = ON);  

columnstore 인덱스Columnstore indexes

기본적으로 SQL 풀은 클러스터형 columnstore 인덱스로 테이블을 저장 합니다.By default, SQL pool stores a table as a clustered columnstore index. 이러한 형태의 데이터 스토리지는 대형 테이블에서 데이터 압축률과 쿼리 성능이 높습니다.This form of data storage achieves high data compression and query performance on large tables.

일반적으로 클러스터형 columnstore 인덱스가 가장 좋은 옵션이지만 클러스터형 인덱스 또는 힙이 적절한 스토리지 구조인 경우도 있습니다.The clustered columnstore index is usually the best choice, but in some cases a clustered index or a heap is the appropriate storage structure.

힙 테이블은 최종 테이블로 변환 된 준비 테이블과 같은 임시 데이터를 로드 하는 데 특히 유용할 수 있습니다.A heap table can be especially useful for loading transient data, such as a staging table which is transformed into a final table.

columnstore 기능 목록은 columnstore 인덱스의 새로운 기능을 참조하세요.For a list of columnstore features, see What's new for columnstore indexes. columnstore 인덱스 성능을 향상하려면 columnstore 인덱스의 행 그룹 품질 최대화를 참조하세요.To improve columnstore index performance, see Maximizing rowgroup quality for columnstore indexes.

통계Statistics

쿼리 최적화 프로그램은 쿼리 실행 계획을 만들 때 열 수준 통계를 사용합니다.The query optimizer uses column-level statistics when it creates the plan for executing a query.

쿼리 성능을 향상 시키려면 특히 쿼리 조인에 사용 되는 열, 개별 열에 대 한 통계를 포함 하는 것이 중요 합니다.To improve query performance, it's important to have statistics on individual columns, especially columns used in query joins. 통계 만들기 는 자동으로 수행 됩니다.Creating statistics happens automatically.

통계 업데이트는 자동으로 수행 되지 않습니다.Updating statistics doesn't happen automatically. 많은 행을 추가하거나 변경한 후에는 통계를 업데이트합니다.Update statistics after a significant number of rows are added or changed. 예를 들어 로드 후 통계를 업데이트합니다.For example, update statistics after a load. 자세한 내용은 통계 가이드를 참조하세요.For more information, see Statistics guidance.

기본 키 및 고유 키Primary key and unique key

기본 키는 비클러스터형이 모두 사용 되는 경우에만 지원 됩니다.PRIMARY KEY is only supported when NONCLUSTERED and NOT ENFORCED are both used. UNIQUE 제약 조건은 적용 되지 않음이 사용 되는 경우에만 지원 됩니다.UNIQUE constraint is only supported with NOT ENFORCED is used. SQL 풀 테이블 제약 조건을확인 합니다.Check SQL pool Table Constraints.

테이블을 만드는 명령Commands for creating tables

테이블을 새로운 빈 테이블로 만들 수 있습니다.You can create a table as a new empty table. 테이블을 만들고 select 문의 결과로 채울 수도 있습니다.You can also create and populate a table with the results of a select statement. 다음은 테이블을 만드는 T-SQL 명령입니다.The following are the T-SQL commands for creating a table.

T-SQL 문T-SQL Statement 설명Description
CREATE TABLECREATE TABLE 모든 테이블 열과 옵션을 정의하여 빈 테이블을 만듭니다.Creates an empty table by defining all the table columns and options.
CREATE EXTERNAL TABLECREATE EXTERNAL TABLE 외부 테이블을 만듭니다.Creates an external table. 테이블의 정의는 SQL 풀에 저장 됩니다.The definition of the table is stored in SQL pool. 테이블 데이터는 Azure Blob Storage 또는 Azure Data Lake Store에 저장됩니다.The table data is stored in Azure Blob storage or Azure Data Lake Store.
CREATE TABLE AS SELECTCREATE TABLE AS SELECT select 문의 결과로 새 테이블을 채웁니다.Populates a new table with the results of a select statement. 테이블 열과 데이터 형식은 select 문의 결과를 기반으로 합니다.The table columns and data types are based on the select statement results. 데이터를 가져오기 위해 이 문은 외부 테이블에서 선택할 수 있습니다.To import data, this statement can select from an external table.
CREATE EXTERNAL TABLE AS SELECTCREATE EXTERNAL TABLE AS SELECT select 문의 결과를 외부 위치로 내보내 새 외부 테이블을 만듭니다.Creates a new external table by exporting the results of a select statement to an external location. 위치는 Azure Blob Storage 또는 Azure Data Lake Store입니다.The location is either Azure Blob storage or Azure Data Lake Store.

원본 데이터를 SQL 풀과 정렬Aligning source data with the SQL pool

SQL 풀 테이블은 다른 데이터 원본에서 데이터를 로드 하 여 채워집니다.SQL pool tables are populated by loading data from another data source. 성공적인 로드를 수행 하려면 원본 데이터의 열 수와 데이터 형식이 SQL 풀의 테이블 정의와 일치 해야 합니다.To perform a successful load, the number and data types of the columns in the source data must align with the table definition in the SQL pool. 맞출 데이터를 가져오는 것이 테이블 디자인의 가장 어려운 부분일 수 있습니다.Getting the data to align might be the hardest part of designing your tables.

데이터를 여러 데이터 저장소에서 가져오는 경우 SQL 풀에 데이터를 로드 하 여 통합 테이블에 저장 합니다.If data is coming from multiple data stores, you load the data into the SQL pool and store it in an integration table. 데이터가 통합 테이블에 있으면 SQL 풀의 기능을 사용 하 여 변환 작업을 수행할 수 있습니다.Once data is in the integration table, you can use the power of SQL pool to perform transformation operations. 데이터가 준비되면 프로덕션 테이블에 삽입할 수 있습니다.Once the data is prepared, you can insert it into production tables.

지원되지 않는 테이블 기능Unsupported table features

SQL 풀은 다른 데이터베이스에서 제공 하는 테이블 기능을 대부분 지원 합니다.SQL pool supports many, but not all, of the table features offered by other databases. 다음 목록에서는 SQL 풀에서 지원 되지 않는 테이블 기능 중 일부를 보여 줍니다.The following list shows some of the table features that aren't supported in SQL pool:

테이블 크기 쿼리Table size queries

60개의 각 배포에서 한 테이블에 사용되는 공간 및 행을 식별하는 한 가지 간단한 방법은 DBCC PDW_SHOWSPACEUSED를 사용하는 것입니다.One simple way to identify space and rows consumed by a table in each of the 60 distributions, is to use DBCC PDW_SHOWSPACEUSED.

DBCC PDW_SHOWSPACEUSED('dbo.FactInternetSales');

그러나 DBCC 명령을 사용하면 작업이 상당히 제한될 수 있습니다.However, using DBCC commands can be quite limiting. DMV(동적 관리 뷰)는 DBCC 명령보다 자세한 내용을 표시합니다.Dynamic management views (DMVs) show more detail than DBCC commands. 다음 뷰를 만들어 시작 합니다.Start by creating this view:

CREATE VIEW dbo.vTableSizes
AS
WITH base
AS
(
SELECT
 GETDATE()                                                             AS  [execution_time]
, DB_NAME()                                                            AS  [database_name]
, s.name                                                               AS  [schema_name]
, t.name                                                               AS  [table_name]
, QUOTENAME(s.name)+'.'+QUOTENAME(t.name)                              AS  [two_part_name]
, nt.[name]                                                            AS  [node_table_name]
, ROW_NUMBER() OVER(PARTITION BY nt.[name] ORDER BY (SELECT NULL))     AS  [node_table_name_seq]
, tp.[distribution_policy_desc]                                        AS  [distribution_policy_name]
, c.[name]                                                             AS  [distribution_column]
, nt.[distribution_id]                                                 AS  [distribution_id]
, i.[type]                                                             AS  [index_type]
, i.[type_desc]                                                        AS  [index_type_desc]
, nt.[pdw_node_id]                                                     AS  [pdw_node_id]
, pn.[type]                                                            AS  [pdw_node_type]
, pn.[name]                                                            AS  [pdw_node_name]
, di.name                                                              AS  [dist_name]
, di.position                                                          AS  [dist_position]
, nps.[partition_number]                                               AS  [partition_nmbr]
, nps.[reserved_page_count]                                            AS  [reserved_space_page_count]
, nps.[reserved_page_count] - nps.[used_page_count]                    AS  [unused_space_page_count]
, nps.[in_row_data_page_count]
    + nps.[row_overflow_used_page_count]
    + nps.[lob_used_page_count]                                        AS  [data_space_page_count]
, nps.[reserved_page_count]
 - (nps.[reserved_page_count] - nps.[used_page_count])
 - ([in_row_data_page_count]
         + [row_overflow_used_page_count]+[lob_used_page_count])       AS  [index_space_page_count]
, nps.[row_count]                                                      AS  [row_count]
from
    sys.schemas s
INNER JOIN sys.tables t
    ON s.[schema_id] = t.[schema_id]
INNER JOIN sys.indexes i
    ON  t.[object_id] = i.[object_id]
    AND i.[index_id] <= 1
INNER JOIN sys.pdw_table_distribution_properties tp
    ON t.[object_id] = tp.[object_id]
INNER JOIN sys.pdw_table_mappings tm
    ON t.[object_id] = tm.[object_id]
INNER JOIN sys.pdw_nodes_tables nt
    ON tm.[physical_name] = nt.[name]
INNER JOIN sys.dm_pdw_nodes pn
    ON  nt.[pdw_node_id] = pn.[pdw_node_id]
INNER JOIN sys.pdw_distributions di
    ON  nt.[distribution_id] = di.[distribution_id]
INNER JOIN sys.dm_pdw_nodes_db_partition_stats nps
    ON nt.[object_id] = nps.[object_id]
    AND nt.[pdw_node_id] = nps.[pdw_node_id]
    AND nt.[distribution_id] = nps.[distribution_id]
LEFT OUTER JOIN (select * from sys.pdw_column_distribution_properties where distribution_ordinal = 1) cdp
    ON t.[object_id] = cdp.[object_id]
LEFT OUTER JOIN sys.columns c
    ON cdp.[object_id] = c.[object_id]
    AND cdp.[column_id] = c.[column_id]
WHERE pn.[type] = 'COMPUTE'
)
, size
AS
(
SELECT
   [execution_time]
,  [database_name]
,  [schema_name]
,  [table_name]
,  [two_part_name]
,  [node_table_name]
,  [node_table_name_seq]
,  [distribution_policy_name]
,  [distribution_column]
,  [distribution_id]
,  [index_type]
,  [index_type_desc]
,  [pdw_node_id]
,  [pdw_node_type]
,  [pdw_node_name]
,  [dist_name]
,  [dist_position]
,  [partition_nmbr]
,  [reserved_space_page_count]
,  [unused_space_page_count]
,  [data_space_page_count]
,  [index_space_page_count]
,  [row_count]
,  ([reserved_space_page_count] * 8.0)                                 AS [reserved_space_KB]
,  ([reserved_space_page_count] * 8.0)/1000                            AS [reserved_space_MB]
,  ([reserved_space_page_count] * 8.0)/1000000                         AS [reserved_space_GB]
,  ([reserved_space_page_count] * 8.0)/1000000000                      AS [reserved_space_TB]
,  ([unused_space_page_count]   * 8.0)                                 AS [unused_space_KB]
,  ([unused_space_page_count]   * 8.0)/1000                            AS [unused_space_MB]
,  ([unused_space_page_count]   * 8.0)/1000000                         AS [unused_space_GB]
,  ([unused_space_page_count]   * 8.0)/1000000000                      AS [unused_space_TB]
,  ([data_space_page_count]     * 8.0)                                 AS [data_space_KB]
,  ([data_space_page_count]     * 8.0)/1000                            AS [data_space_MB]
,  ([data_space_page_count]     * 8.0)/1000000                         AS [data_space_GB]
,  ([data_space_page_count]     * 8.0)/1000000000                      AS [data_space_TB]
,  ([index_space_page_count]  * 8.0)                                   AS [index_space_KB]
,  ([index_space_page_count]  * 8.0)/1000                              AS [index_space_MB]
,  ([index_space_page_count]  * 8.0)/1000000                           AS [index_space_GB]
,  ([index_space_page_count]  * 8.0)/1000000000                        AS [index_space_TB]
FROM base
)
SELECT *
FROM size
;

테이블 공간 요약Table space summary

이 쿼리는 테이블에 의해 행 및 공간을 반환합니다.This query returns the rows and space by table. 가장 큰 테이블이 되는 테이블과 라운드 로빈, 복제 또는 해시 분산 여부를 확인할 수 있습니다.It allows you to see which tables are your largest tables and whether they're round-robin, replicated, or hash -distributed. 해시 분산 테이블의 경우 쿼리에서 배포 열을 보여 줍니다.For hash-distributed tables, the query shows the distribution column.

SELECT
     database_name
,    schema_name
,    table_name
,    distribution_policy_name
,      distribution_column
,    index_type_desc
,    COUNT(distinct partition_nmbr) as nbr_partitions
,    SUM(row_count)                 as table_row_count
,    SUM(reserved_space_GB)         as table_reserved_space_GB
,    SUM(data_space_GB)             as table_data_space_GB
,    SUM(index_space_GB)            as table_index_space_GB
,    SUM(unused_space_GB)           as table_unused_space_GB
FROM
    dbo.vTableSizes
GROUP BY
     database_name
,    schema_name
,    table_name
,    distribution_policy_name
,      distribution_column
,    index_type_desc
ORDER BY
    table_reserved_space_GB desc
;

배포 유형별 테이블 공간Table space by distribution type

SELECT
     distribution_policy_name
,    SUM(row_count)                as table_type_row_count
,    SUM(reserved_space_GB)        as table_type_reserved_space_GB
,    SUM(data_space_GB)            as table_type_data_space_GB
,    SUM(index_space_GB)           as table_type_index_space_GB
,    SUM(unused_space_GB)          as table_type_unused_space_GB
FROM dbo.vTableSizes
GROUP BY distribution_policy_name
;

인덱스 유형별 테이블 공간Table space by index type

SELECT
     index_type_desc
,    SUM(row_count)                as table_type_row_count
,    SUM(reserved_space_GB)        as table_type_reserved_space_GB
,    SUM(data_space_GB)            as table_type_data_space_GB
,    SUM(index_space_GB)           as table_type_index_space_GB
,    SUM(unused_space_GB)          as table_type_unused_space_GB
FROM dbo.vTableSizes
GROUP BY index_type_desc
;

배포 공간 요약Distribution space summary

SELECT
    distribution_id
,    SUM(row_count)                as total_node_distribution_row_count
,    SUM(reserved_space_MB)        as total_node_distribution_reserved_space_MB
,    SUM(data_space_MB)            as total_node_distribution_data_space_MB
,    SUM(index_space_MB)           as total_node_distribution_index_space_MB
,    SUM(unused_space_MB)          as total_node_distribution_unused_space_MB
FROM dbo.vTableSizes
GROUP BY     distribution_id
ORDER BY    distribution_id
;

다음 단계Next steps

SQL 풀에 대 한 테이블을 만든 후 다음 단계는 테이블에 데이터를 로드 하는 것입니다.After creating the tables for your SQL pool, the next step is to load data into the table. 로드 자습서는 SQL 풀에 데이터 로드를 참조 하세요.For a loading tutorial, see Loading data to SQL pool.