Azure Synapse Analytics(Azure SQL DW)中建表语句的注意事项
目錄
(一)前言
(二)建表語法
(三)參數(shù)說明
1. 列選項
2. 表結(jié)構(gòu)選項
3. 表分發(fā)選項
4. 表分區(qū)選項
(四)實例
1.?列的示例
(1)?指定一個列排序規(guī)則
(2)?指定列的 DEFAULT 約束
2.?表結(jié)構(gòu)的示例
(1)創(chuàng)建一個具有聚集列存儲索引的表
(2)創(chuàng)建有序聚集列存儲索引
3.?表分發(fā)的示例
(1)創(chuàng)建 ROUND_ROBIN 表
(2)創(chuàng)建哈希分布式表
(3)創(chuàng)建已復(fù)制的表
4.?表分區(qū)的示例
(1)創(chuàng)建已分區(qū)表
(2)使用一個分區(qū)創(chuàng)建已分區(qū)表
(3)創(chuàng)建具有日期分區(qū)的表
(一)前言
? ? ? ?本文我們來探討一個看似比較簡單但實際上說清楚需要很多門道的操作,即建表語句以及語句中相關(guān)參數(shù)的含義,接下來讓我們來具體看下一些建表基本事項。
(二)建表語法
-- 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(三)參數(shù)說明
database_name
將包含新表的數(shù)據(jù)庫的名稱。 默認(rèn)為當(dāng)前數(shù)據(jù)庫。
schema_name
表的架構(gòu)。 可選擇指定架構(gòu) 。 如果是空白,將使用默認(rèn)架構(gòu)。
table_name
新表的名稱。 若要創(chuàng)建本地臨時表,請在表名前加上?#。
column_name
表列的名稱。
1. 列選項
COLLATE?Windows_collation_name
指定表達(dá)式的排序規(guī)則。 此排序規(guī)則必須是 SQL Server 支持的 Windows 排序規(guī)則之一。?
NULL?|?NOT NULL
指定列中是否允許使用?NULL?值。 默認(rèn)為?NULL。
[?CONSTRAINTconstraint_name?]?DEFAULTconstant_expression
指定默認(rèn)列值。
| constraint_name | 約束的可選名稱。 該約束名稱在數(shù)據(jù)庫中是唯一的。 此名稱可以重用于其他數(shù)據(jù)庫。 |
| constant_expression | 列的默認(rèn)值。 表達(dá)式必須是文本值或一個常數(shù)。 例如,允許的常數(shù)表達(dá)式:'CA'、4。 禁止使用這些常量表達(dá)式:2+3、CURRENT_TIMESTAMP。 |
2. 表結(jié)構(gòu)選項
CLUSTERED COLUMNSTORE INDEX
將表存儲為聚集列存儲索引。 聚集列存儲索引應(yīng)用于所有表數(shù)據(jù)。 這是 Azure Synapse Analytics 的默認(rèn)行為。
HEAP:將表存儲為堆。 這是 Analytics Platform System (PDW) 的默認(rèn)行為。
CLUSTERED INDEX?( index_column_name [ ,...n ] )
將表存儲為具有一個或多個鍵列的聚集索引。 此行為按行存儲數(shù)據(jù)。 在索引中使用 index_column_name 來指定一個或多個鍵列的名稱 。 有關(guān)詳細(xì)信息,請參閱常規(guī)注釋中的行存儲表。
LOCATION = USER_DB:此選項已遭棄用。 雖然在語法上可接受,但已不再需要它,而且它也不再影響行為。
3. 表分發(fā)選項
DISTRIBUTION = HASH?(distribution_column_name ):通過哈希處理 distribution_column_name 中存儲的值,將每行都分配到一個分發(fā)。 算法是確定性的。也就是說,它總是將相同的值哈希到相同的分發(fā)。 應(yīng)將分發(fā)列定義為 NOT NULL,因為所有包含 NULL 值的行都分配到相同的分發(fā)。
DISTRIBUTION = ROUND_ROBIN:以輪循機(jī)制在所有分發(fā)上均勻地分發(fā)行。 這是 Azure Synapse Analytics 的默認(rèn)行為。
DISTRIBUTION = REPLICATE:將表的一個副本存儲在每個 Compute 節(jié)點上。 對于 Azure Synapse Analytics,表存儲在每個 Compute 節(jié)點上的分發(fā)數(shù)據(jù)庫上。 對于 Analytics Platform System (PDW),表存儲在跨 Compute 節(jié)點的 SQL Server 文件組中。 這是 Analytics Platform System (PDW) 的默認(rèn)行為。
4. 表分區(qū)選項
PARTITION?( partition_column_name?RANGE?[?LEFT?|?RIGHT?]?FOR VALUES?( [ boundary_value [,...n] ] ))
創(chuàng)建一個或多個表分區(qū)。 這些分區(qū)是水平表切片,可便于向行的子集應(yīng)用操作,無論表是作為堆、聚集索引還是聚集列存儲索引進(jìn)行存儲。 與分發(fā)列不同,表分區(qū)不確定存儲每行的分發(fā)。 表分區(qū)決定行如何分組并存儲在每個分發(fā)中。
| partition_column_name | 指定 Azure Synapse Analytics 將用于行分區(qū)的列。 此列可以是任何數(shù)據(jù)類型。 Azure Synapse Analytics 按升序?qū)Ψ謪^(qū)列值進(jìn)行排序。 在?LEFT?規(guī)范中,由低到高的排序是從?RIGHT?到?RANGE。 |
| RANGE LEFT | 指定屬于左側(cè)分區(qū)的邊界值(較低值)。 默認(rèn)為“左”。 |
| RANGE RIGHT | 指定屬于右側(cè)分區(qū)的邊界值(較高值)。 |
| FOR VALUES?( boundary_value [,...n] ) | 指定分區(qū)的邊界值。 boundary_value 是一個常數(shù)表達(dá)式 。 它不得為 NULL。 它必須匹配或可以隱式轉(zhuǎn)換為 partition_column_name 的數(shù)據(jù)類型 。 無法在隱式轉(zhuǎn)換期間截斷它,這樣值的大小和確定位數(shù)與 partition_column_name 的數(shù)據(jù)類型不匹配 如果你指定?PARTITION?子句,但不指定邊界值,Azure Synapse Analytics 會創(chuàng)建包含一個分區(qū)的已分區(qū)表。 如果適用,稍后可以將表拆分成兩個分區(qū)。 如果指定一個邊界值,生成的表格有兩個分區(qū);一個用于低于邊界值的值,另一個用于高于邊界值的值。 如果你將分區(qū)移到未分區(qū)表中,未分區(qū)表會接收數(shù)據(jù),但它的元數(shù)據(jù)中不會有分區(qū)邊界。 |
(四)實例
1.?列的示例
(1)?指定一個列排序規(guī)則
? ? ? ?在以下示例中,使用兩種不同的列排序規(guī)則創(chuàng)建表?MyTable。 默認(rèn)情況下,列?mycolumn1?具有默認(rèn)的排序規(guī)則 Latin1_General_100_CI_AS_KS_WS。 列?mycolumn2?具有排序規(guī)則 Frisian_100_CS_AS。
CREATE TABLE MyTable ( mycolumnnn1 nvarchar, mycolumn2 nvarchar COLLATE Frisian_100_CS_AS ) WITH ( CLUSTERED COLUMNSTORE INDEX ) ;(2)?指定列的 DEFAULT 約束
? ? ? ?以下示例顯示了為列指定默認(rèn)值的語法。 colA 列有一個名為 constraint_colA 的默認(rèn)約束以及一個默認(rèn)值 0。
CREATE TABLE MyTable( colA int CONSTRAINT constraint_colA DEFAULT 0, colB nvarchar COLLATE Frisian_100_CS_AS) WITH ( CLUSTERED COLUMNSTORE INDEX ) ;2.?表結(jié)構(gòu)的示例
(1)創(chuàng)建一個具有聚集列存儲索引的表
? ? ? ?以下示例創(chuàng)建一個具有聚集列存儲索引的分布式表。 將每個分發(fā)存儲為一個列存儲。
? ? ? ?聚集列存儲索引不影響數(shù)據(jù)的分發(fā)方式;數(shù)據(jù)始終按行分發(fā)。 聚集列存儲索引影響數(shù)據(jù)在每個分發(fā)中的存儲方式。
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)創(chuàng)建有序聚集列存儲索引
? ? ? ?下面的示例展示了如何創(chuàng)建有序聚集列存儲索引。 索引按 SHIPDATE 進(jìn)行排序。
CREATE TABLE Lineitem WITH (DISTRIBUTION = ROUND_ROBIN, CLUSTERED COLUMNSTORE INDEX ORDER(SHIPDATE)) AS SELECT * FROM ext_Lineitem3.?表分發(fā)的示例
(1)創(chuàng)建 ROUND_ROBIN 表
? ? ? ?以下示例創(chuàng)建 ROUND_ROBIN 表,其中包含三列并且沒有分區(qū)。 數(shù)據(jù)分布在所有分發(fā)中。 該表是使用 CLUSTERED COLUMNSTORE INDEX 創(chuàng)建的,它能提供比堆或行存儲聚集索引更好的性能和數(shù)據(jù)壓縮。
CREATE TABLE myTable( id int NOT NULL, lastName varchar(20), zipCode varchar(6) ) WITH ( CLUSTERED COLUMNSTORE INDEX );(2)創(chuàng)建哈希分布式表
? ? ? ?以下示例創(chuàng)建與上面的示例相同的表。 但對于此表,分發(fā)行(位于?id?列),而不是像 ROUND_ROBIN 表一樣隨機(jī)分發(fā)。 該表是使用 CLUSTERED COLUMNSTORE INDEX 創(chuàng)建的,它能提供比堆或行存儲聚集索引更好的性能和數(shù)據(jù)壓縮。
CREATE TABLE myTable( id int NOT NULL, lastName varchar(20), zipCode varchar(6) ) WITH ( DISTRIBUTION = HASH (id), CLUSTERED COLUMNSTORE INDEX );(3)創(chuàng)建已復(fù)制的表
? ? ? ?以下示例創(chuàng)建一個類似于前面示例的已復(fù)制表。 將已復(fù)制表全部復(fù)制到每個 Compute 節(jié)點。 通過每個 Compute 節(jié)點上的副本,可以減少查詢的數(shù)據(jù)移動。 此示例是使用 CLUSTERED INDEX 進(jìn)行創(chuàng)建,可實現(xiàn)比堆更好的數(shù)據(jù)壓縮。 堆可能包含的行不夠,無法實現(xiàn)理想的 CLUSTERED COLUMNSTORE INDEX 壓縮。
CREATE TABLE myTable( id int NOT NULL, lastName varchar(20), zipCode varchar(6) ) WITH ( DISTRIBUTION = REPLICATE,CLUSTERED INDEX (lastName) );4.?表分區(qū)的示例
(1)創(chuàng)建已分區(qū)表
? ? ? ?以下示例創(chuàng)建與示例 A 中所示相同的表,并在?id?列上添加 RANGE LEFT 分區(qū)。 它指定了四個分區(qū)邊界值,所以有五個分區(qū)。
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) ;在此示例中,數(shù)據(jù)將分類到以下分區(qū)中:
- 分區(qū) 1:列 <= 10
- 分區(qū) 2:10 < 列 <= 20
- 分區(qū) 3:20 < 列 <= 30
- 分區(qū) 4:30 < 列 <= 40
- 分區(qū) 5:40 < 列
如果將此同一個表分區(qū)為 RANGE RIGHT 而非 RANGE LEFT(默認(rèn)),數(shù)據(jù)將分類到以下分區(qū)中:
- 分區(qū) 1:列 < 10
- 分區(qū) 2:10 <= 列 < 20
- 分區(qū) 3:20 <= 列 < 30
- 分區(qū) 4:30 <= 列 < 40
- 分區(qū) 5:40 <= 列
?
(2)使用一個分區(qū)創(chuàng)建已分區(qū)表
? ? ? ?以下示例使用一個分區(qū)創(chuàng)建已分區(qū)表。 它不指定任何邊界值,所以有一個分區(qū)。??
CREATE TABLE myTable ( id int NOT NULL, lastName varchar(20), zipCode int) WITH(PARTITION ( id RANGE LEFT FOR VALUES ( )), CLUSTERED COLUMNSTORE INDEX ) ;(3)創(chuàng)建具有日期分區(qū)的表
? ? ? ?以下示例創(chuàng)建一個名為?myTable?的新表,并在?date?列上進(jìn)行分區(qū)。 使用 RANGE RIGHT 和日期作為邊界值,它將在每個分區(qū)中放置一個月的數(shù)據(jù)。
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' )));總結(jié)
以上是生活随笔為你收集整理的Azure Synapse Analytics(Azure SQL DW)中建表语句的注意事项的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何在excel中快速使用日期控件?
- 下一篇: iClock 一款能够「满足“挑剔”的翻