Azure Synapse Analytics(Azure SQL DW)中建表语句的注意事项
目錄
(一)前言
(二)建表語法
(三)參數說明
1. 列選項
2. 表結構選項
3. 表分發選項
4. 表分區選項
(四)實例
1.?列的示例
(1)?指定一個列排序規則
(2)?指定列的 DEFAULT 約束
2.?表結構的示例
(1)創建一個具有聚集列存儲索引的表
(2)創建有序聚集列存儲索引
3.?表分發的示例
(1)創建 ROUND_ROBIN 表
(2)創建哈希分布式表
(3)創建已復制的表
4.?表分區的示例
(1)創建已分區表
(2)使用一個分區創建已分區表
(3)創建具有日期分區的表
(一)前言
? ? ? ?本文我們來探討一個看似比較簡單但實際上說清楚需要很多門道的操作,即建表語句以及語句中相關參數的含義,接下來讓我們來具體看下一些建表基本事項。
(二)建表語法
-- Create a new table. CREATE TABLE { database_name.schema_name.table_name | schema_name.table_name | table_name }( { column_name <data_type> [ <column_options> ] } [ ,...n ]) [ WITH ( <table_option> [ ,...n ] ) ] [;] <column_options> ::=[ COLLATE Windows_collation_name ][ NULL | NOT NULL ] -- default is NULL[ IDENTITY [ ( seed, increment ) ][ <column_constraint> ]<column_constraint>::={DEFAULT constant_expression| PRIMARY KEY NONCLUSTERED NOT ENFORCED -- Applies to Azure Synapse Analytics only| UNIQUE NOT ENFORCED -- Applies to Azure Synapse Analytics only}<table_option> ::={CLUSTERED COLUMNSTORE INDEX -- default for Azure Synapse Analytics | CLUSTERED COLUMNSTORE INDEX ORDER (column [,...n]) | HEAP --default for Parallel Data Warehouse| CLUSTERED INDEX ( { index_column_name [ ASC | DESC ] } [ ,...n ] ) -- default is ASC} {DISTRIBUTION = HASH ( distribution_column_name )| DISTRIBUTION = ROUND_ROBIN -- default for Azure Synapse Analytics| DISTRIBUTION = REPLICATE -- default for Parallel Data Warehouse}| PARTITION ( partition_column_name RANGE [ LEFT | RIGHT ] -- default is LEFT FOR VALUES ( [ boundary_value [,...n] ] ) )<data type> ::=datetimeoffset [ ( n ) ] | datetime2 [ ( n ) ] | datetime | smalldatetime | date | time [ ( n ) ] | float [ ( n ) ] | real [ ( n ) ] | decimal [ ( precision [ , scale ] ) ] | numeric [ ( precision [ , scale ] ) ] | money | smallmoney | bigint | int | smallint | tinyint | bit | nvarchar [ ( n | max ) ] -- max applies only to Azure Synapse Analytics | nchar [ ( n ) ] | varchar [ ( n | max ) ] -- max applies only to Azure Synapse Analytics | char [ ( n ) ] | varbinary [ ( n | max ) ] -- max applies only to Azure Synapse Analytics | binary [ ( n ) ] | uniqueidentifier(三)參數說明
database_name
將包含新表的數據庫的名稱。 默認為當前數據庫。
schema_name
表的架構。 可選擇指定架構 。 如果是空白,將使用默認架構。
table_name
新表的名稱。 若要創建本地臨時表,請在表名前加上?#。
column_name
表列的名稱。
1. 列選項
COLLATE?Windows_collation_name
指定表達式的排序規則。 此排序規則必須是 SQL Server 支持的 Windows 排序規則之一。?
NULL?|?NOT NULL
指定列中是否允許使用?NULL?值。 默認為?NULL。
[?CONSTRAINTconstraint_name?]?DEFAULTconstant_expression
指定默認列值。
| constraint_name | 約束的可選名稱。 該約束名稱在數據庫中是唯一的。 此名稱可以重用于其他數據庫。 |
| constant_expression | 列的默認值。 表達式必須是文本值或一個常數。 例如,允許的常數表達式:'CA'、4。 禁止使用這些常量表達式:2+3、CURRENT_TIMESTAMP。 |
2. 表結構選項
CLUSTERED COLUMNSTORE INDEX
將表存儲為聚集列存儲索引。 聚集列存儲索引應用于所有表數據。 這是 Azure Synapse Analytics 的默認行為。
HEAP:將表存儲為堆。 這是 Analytics Platform System (PDW) 的默認行為。
CLUSTERED INDEX?( index_column_name [ ,...n ] )
將表存儲為具有一個或多個鍵列的聚集索引。 此行為按行存儲數據。 在索引中使用 index_column_name 來指定一個或多個鍵列的名稱 。 有關詳細信息,請參閱常規注釋中的行存儲表。
LOCATION = USER_DB:此選項已遭棄用。 雖然在語法上可接受,但已不再需要它,而且它也不再影響行為。
3. 表分發選項
DISTRIBUTION = HASH?(distribution_column_name ):通過哈希處理 distribution_column_name 中存儲的值,將每行都分配到一個分發。 算法是確定性的。也就是說,它總是將相同的值哈希到相同的分發。 應將分發列定義為 NOT NULL,因為所有包含 NULL 值的行都分配到相同的分發。
DISTRIBUTION = ROUND_ROBIN:以輪循機制在所有分發上均勻地分發行。 這是 Azure Synapse Analytics 的默認行為。
DISTRIBUTION = REPLICATE:將表的一個副本存儲在每個 Compute 節點上。 對于 Azure Synapse Analytics,表存儲在每個 Compute 節點上的分發數據庫上。 對于 Analytics Platform System (PDW),表存儲在跨 Compute 節點的 SQL Server 文件組中。 這是 Analytics Platform System (PDW) 的默認行為。
4. 表分區選項
PARTITION?( partition_column_name?RANGE?[?LEFT?|?RIGHT?]?FOR VALUES?( [ boundary_value [,...n] ] ))
創建一個或多個表分區。 這些分區是水平表切片,可便于向行的子集應用操作,無論表是作為堆、聚集索引還是聚集列存儲索引進行存儲。 與分發列不同,表分區不確定存儲每行的分發。 表分區決定行如何分組并存儲在每個分發中。
| partition_column_name | 指定 Azure Synapse Analytics 將用于行分區的列。 此列可以是任何數據類型。 Azure Synapse Analytics 按升序對分區列值進行排序。 在?LEFT?規范中,由低到高的排序是從?RIGHT?到?RANGE。 |
| RANGE LEFT | 指定屬于左側分區的邊界值(較低值)。 默認為“左”。 |
| RANGE RIGHT | 指定屬于右側分區的邊界值(較高值)。 |
| FOR VALUES?( boundary_value [,...n] ) | 指定分區的邊界值。 boundary_value 是一個常數表達式 。 它不得為 NULL。 它必須匹配或可以隱式轉換為 partition_column_name 的數據類型 。 無法在隱式轉換期間截斷它,這樣值的大小和確定位數與 partition_column_name 的數據類型不匹配 如果你指定?PARTITION?子句,但不指定邊界值,Azure Synapse Analytics 會創建包含一個分區的已分區表。 如果適用,稍后可以將表拆分成兩個分區。 如果指定一個邊界值,生成的表格有兩個分區;一個用于低于邊界值的值,另一個用于高于邊界值的值。 如果你將分區移到未分區表中,未分區表會接收數據,但它的元數據中不會有分區邊界。 |
(四)實例
1.?列的示例
(1)?指定一個列排序規則
? ? ? ?在以下示例中,使用兩種不同的列排序規則創建表?MyTable。 默認情況下,列?mycolumn1?具有默認的排序規則 Latin1_General_100_CI_AS_KS_WS。 列?mycolumn2?具有排序規則 Frisian_100_CS_AS。
CREATE TABLE MyTable ( mycolumnnn1 nvarchar, mycolumn2 nvarchar COLLATE Frisian_100_CS_AS ) WITH ( CLUSTERED COLUMNSTORE INDEX ) ;(2)?指定列的 DEFAULT 約束
? ? ? ?以下示例顯示了為列指定默認值的語法。 colA 列有一個名為 constraint_colA 的默認約束以及一個默認值 0。
CREATE TABLE MyTable( colA int CONSTRAINT constraint_colA DEFAULT 0, colB nvarchar COLLATE Frisian_100_CS_AS) WITH ( CLUSTERED COLUMNSTORE INDEX ) ;2.?表結構的示例
(1)創建一個具有聚集列存儲索引的表
? ? ? ?以下示例創建一個具有聚集列存儲索引的分布式表。 將每個分發存儲為一個列存儲。
? ? ? ?聚集列存儲索引不影響數據的分發方式;數據始終按行分發。 聚集列存儲索引影響數據在每個分發中的存儲方式。
CREATE TABLE MyTable( colA int CONSTRAINT constraint_colA DEFAULT 0, colB nvarchar COLLATE Frisian_100_CS_AS) WITH ( DISTRIBUTION = HASH ( colB ), CLUSTERED COLUMNSTORE INDEX) ;(2)創建有序聚集列存儲索引
? ? ? ?下面的示例展示了如何創建有序聚集列存儲索引。 索引按 SHIPDATE 進行排序。
CREATE TABLE Lineitem WITH (DISTRIBUTION = ROUND_ROBIN, CLUSTERED COLUMNSTORE INDEX ORDER(SHIPDATE)) AS SELECT * FROM ext_Lineitem3.?表分發的示例
(1)創建 ROUND_ROBIN 表
? ? ? ?以下示例創建 ROUND_ROBIN 表,其中包含三列并且沒有分區。 數據分布在所有分發中。 該表是使用 CLUSTERED COLUMNSTORE INDEX 創建的,它能提供比堆或行存儲聚集索引更好的性能和數據壓縮。
CREATE TABLE myTable( id int NOT NULL, lastName varchar(20), zipCode varchar(6) ) WITH ( CLUSTERED COLUMNSTORE INDEX );(2)創建哈希分布式表
? ? ? ?以下示例創建與上面的示例相同的表。 但對于此表,分發行(位于?id?列),而不是像 ROUND_ROBIN 表一樣隨機分發。 該表是使用 CLUSTERED COLUMNSTORE INDEX 創建的,它能提供比堆或行存儲聚集索引更好的性能和數據壓縮。
CREATE TABLE myTable( id int NOT NULL, lastName varchar(20), zipCode varchar(6) ) WITH ( DISTRIBUTION = HASH (id), CLUSTERED COLUMNSTORE INDEX );(3)創建已復制的表
? ? ? ?以下示例創建一個類似于前面示例的已復制表。 將已復制表全部復制到每個 Compute 節點。 通過每個 Compute 節點上的副本,可以減少查詢的數據移動。 此示例是使用 CLUSTERED INDEX 進行創建,可實現比堆更好的數據壓縮。 堆可能包含的行不夠,無法實現理想的 CLUSTERED COLUMNSTORE INDEX 壓縮。
CREATE TABLE myTable( id int NOT NULL, lastName varchar(20), zipCode varchar(6) ) WITH ( DISTRIBUTION = REPLICATE,CLUSTERED INDEX (lastName) );4.?表分區的示例
(1)創建已分區表
? ? ? ?以下示例創建與示例 A 中所示相同的表,并在?id?列上添加 RANGE LEFT 分區。 它指定了四個分區邊界值,所以有五個分區。
CREATE TABLE myTable( id int NOT NULL, lastName varchar(20), zipCode int) WITH(PARTITION ( id RANGE LEFT FOR VALUES (10, 20, 30, 40 )), CLUSTERED COLUMNSTORE INDEX) ;在此示例中,數據將分類到以下分區中:
- 分區 1:列 <= 10
- 分區 2:10 < 列 <= 20
- 分區 3:20 < 列 <= 30
- 分區 4:30 < 列 <= 40
- 分區 5:40 < 列
如果將此同一個表分區為 RANGE RIGHT 而非 RANGE LEFT(默認),數據將分類到以下分區中:
- 分區 1:列 < 10
- 分區 2:10 <= 列 < 20
- 分區 3:20 <= 列 < 30
- 分區 4:30 <= 列 < 40
- 分區 5:40 <= 列
?
(2)使用一個分區創建已分區表
? ? ? ?以下示例使用一個分區創建已分區表。 它不指定任何邊界值,所以有一個分區。??
CREATE TABLE myTable ( id int NOT NULL, lastName varchar(20), zipCode int) WITH(PARTITION ( id RANGE LEFT FOR VALUES ( )), CLUSTERED COLUMNSTORE INDEX ) ;(3)創建具有日期分區的表
? ? ? ?以下示例創建一個名為?myTable?的新表,并在?date?列上進行分區。 使用 RANGE RIGHT 和日期作為邊界值,它將在每個分區中放置一個月的數據。
CREATE TABLE myTable ( l_orderkey bigint,l_partkey bigint,l_suppkey bigint,l_linenumber bigint,l_quantity decimal(15,2), l_extendedprice decimal(15,2), l_discount decimal(15,2), l_tax decimal(15,2), l_returnflag char(1), l_linestatus char(1), l_shipdate date, l_commitdate date, l_receiptdate date, l_shipinstruct char(25), l_shipmode char(10), l_comment varchar(44)) WITH(DISTRIBUTION = HASH (l_orderkey), CLUSTERED COLUMNSTORE INDEX, PARTITION ( l_shipdate RANGE RIGHT FOR VALUES( '1992-01-01','1992-02-01','1992-03-01','1992-04-01','1992-05-01','1992-06-01','1992-07-01','1992-08-01','1992-09-01','1992-10-01','1992-11-01','1992-12-01','1993-01-01','1993-02-01','1993-03-01','1993-04-01','1993-05-01','1993-06-01','1993-07-01','1993-08-01','1993-09-01','1993-10-01','1993-11-01','1993-12-01','1994-01-01','1994-02-01','1994-03-01','1994-04-01','1994-05-01','1994-06-01','1994-07-01','1994-08-01','1994-09-01','1994-10-01','1994-11-01','1994-12-01' )));總結
以上是生活随笔為你收集整理的Azure Synapse Analytics(Azure SQL DW)中建表语句的注意事项的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何在excel中快速使用日期控件?
- 下一篇: kill -HUP重启mysql_kil