Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A következőkre vonatkozik:Azure Synapse Analytics
Analytics Platform System (PDW)
CREATE TABLE AS SELECT (CTAS) az egyik legfontosabb elérhető T-SQL funkció. Ez egy teljesen párhuzamos művelet, amely egy új táblát hoz létre egy SELECT utasítás kimenete alapján. A CTAS a legegyszerűbb és leggyorsabb módja annak, hogy táblázat másolatát készítsünk.
Például a CTAS segítségével a következőképpen használhatjuk:
- Hozzon létre egy táblázatot egy másik hash eloszlás oszloppal.
- Hozz létre egy táblázatot újra, ahogy replikált.
- Hozz létre egy oszloptároló indexet a táblázat néhány oszlopán.
- Külső adatokat keress vagy importálj.
Megjegyzés:
Mivel CREATE TABLE AS SELECT a (CTAS) növeli a táblázat létrehozásának lehetőségeit, ez a téma igyekszik nem ismételni a témát CREATE TABLE . Ehelyett a CTAS és a CREATE TABLE közötti különbségeket írja le.
- A CTAS támogatja a Microsoft Fabric Warehouse-ban. Tekintse meg a CREATE TABLE AS SELECT cikk Fabric verzióját.
- Ezt a szintaxist az Azure Synapse Analytics kiszolgáló nélküli SQL-készlete nem támogatja.
-
CREATE TABLE AS SELECT(CTAS) a Microsoft Fabric Warehouse támogatásában van. További információért lásd a Fabric Data Warehouse verzióját ennek a cikknek.
Transact-SQL szintaxis konvenciók
Szemantika
CREATE TABLE { database_name.schema_name.table_name | schema_name.table_name | table_name }
[ ( column_name [ ,...n ] ) ]
WITH (
<distribution_option> -- required
[ , <table_option> [ ,...n ] ]
)
AS <select_statement>
OPTION <query_hint>
[;]
<distribution_option> ::=
{
DISTRIBUTION = HASH ( distribution_column_name )
| DISTRIBUTION = HASH ( [distribution_column_name [, ...n]] )
| DISTRIBUTION = ROUND_ROBIN
| DISTRIBUTION = REPLICATE
}
<table_option> ::=
{
CLUSTERED COLUMNSTORE INDEX --default for 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
}
| PARTITION ( partition_column_name RANGE [ LEFT | RIGHT ] --default is LEFT
FOR VALUES ( [ boundary_value [,...n] ] ) )
<select_statement> ::=
[ WITH <common_table_expression> [ ,...n ] ]
SELECT select_criteria
<query_hint> ::=
{
MAXDOP
}
Arguments
További információért lásd az Érvek szekciót .CREATE TABLE
Oszlopbeállítások
column_name [ ,...n ]
Az oszlopnevek nem engedélyezik a CREATE TABLE oszlopopciókat , amelyeket a benne CREATE TABLEemlítenek. Ehelyett megadhat egy vagy több oszlopnevet az új táblához. Az új tábla oszlopai a megadott neveket használják. Ha oszlopneveket ad meg, az oszloplistában szereplő oszlopok számának meg kell egyeznie a kiválasztási eredmények oszlopainak számával. Ha nem ad meg oszlopneveket, az új céltábla a select utasítás eredményében szereplő oszlopneveket használja.
Nem adhat meg más oszlopbeállításokat, például adattípusokat, rendezést vagy nullitást. Mindegyik attribútum az állítás eredményeiből SELECT származik. A SELECT utasítással azonban módosíthatja az attribútumokat. Például lásd: Használd a CTAS oszlopattribútumok megváltoztatásához.
Táblázatelosztási lehetőségek
A részletekért és a legjobb eloszlási oszlop kiválasztásáért lásd a Táblázat-eloszlási opciók szekciót a .CREATE TABLE Ajánlásokért a táblázat tényleges használat vagy mintalekérdezések alapján válasszuk a táblázathoz, lásd az Azure Synapse SQL Distribution Advisor című programot.
DISTRIBUTION
=
HASH (distribution_column_name) | ROUND_ROBIN | UTÁNOZ
A CTAS utasítás elosztási opciót igényel, és nincs alapértelmezett értéke. Ez eltér a CREATE TABLE (CREATE TABLE) funkciótól, amelynek alapértelmezései vannak.
DISTRIBUTION = HASH ( [distribution_column_name [, ...n]] )
A sorokat legfeljebb nyolc oszlop hash értékei alapján osztja el, lehetővé téve az alaptábla adatok egyenletesebb elosztását, csökkentve az adattorzítást és javítva a lekérdezések teljesítményét.
Megjegyzés:
- A funkció engedélyezéséhez módosítsd az adatbázis kompatibilitási szintjét 50-re ezzel a parancsmal. További információért az adatbázis kompatibilitási szintjének beállításáról lásd: ALTER DATABASE SCOPED CONFIGURATION. Például:
ALTER DATABASE SCOPED CONFIGURATION SET DW_COMPATIBILITY_LEVEL = 50; - A többoszlopos eloszlás (MCD) funkció letiltásához futtatjuk ezt a parancsot, hogy az adatbázis kompatibilitási szintjét AUTO-ra változtassuk. Például:
ALTER DATABASE SCOPED CONFIGURATION SET DW_COMPATIBILITY_LEVEL = AUTO;a meglévő MCD táblák megmaradnak, de olvashatatlanná válnak. Az MCD táblákon keresztül történő lekérdezések ezt a hibát adják vissza:Related table/view is not readable because it distributes data on multiple columns and multi-column distribution is not supported by this product version or this feature is disabled.- Az MCD táblákhoz való hozzáférés visszaszerzéséhez újra engedélyezd a funkciót.
- Az adatok betöltéséhez egy MCD táblába használjunk CTAS utasítást, és az adatforrásnak Synapse SQL táblázatoknak kell lennie.
- A CTAS az MCD HEAP céltáblákon nem támogatott. Ehelyett az INSERT SELECT megoldást használd az adatok betöltésére MCD HEAP táblákba.
- Az SSMS használata szkript generálására MCD táblák létrehozásához jelenleg támogatott az SSMS 19-es verziója után.
A részletekért és a legjobb eloszlási oszlop kiválasztásáért lásd a Táblázat-eloszlási opciók szekciót a .CREATE TABLE
A legjobb disztribúció ajánlásaiért a munkaterhelésed alapján lásd a Synapse SQL Distribution Advisor (Preview) oldalt.
Táblázat partíciós opciók
A CTAS utasítás alapértelmezés szerint nem partíciós táblát hoz létre, még akkor is, ha a forrástábla partíciózva van. A CTAS utasítással megosztott tábla létrehozásához meg kell határoznod a partíciós opciót.
Részletekért lásd a Táblázat partíciós opciók szekcióját .CREATE TABLE
SELECT utasítás
A SELECT utasítás az alapvető különbség a CTAS és a CREATE TABLE között.
WITH
common_table_expression
Egy ideiglenes elnevezett eredménykészletet határoz meg, amelyet közös táblakifejezésnek (CTE) nevezünk. További információ: WITH common_table_expression (Transact-SQL).
SELECT
select_criteria
Kitölti az új táblát egy SELECT utasítás eredményeivel. select_criteria a SELECT utasítás törzse, amely meghatározza, hogy mely adatokat másolja az új táblába. A SELECT utasításokról további információt SELECT (Transact-SQL)című cikkben talál.
Lekérdezési tipp
A felhasználók egész értékre állíthatják a MAXDOP-ot, hogy szabályozzák a párhuzamosság maximális fokát. Ha a MAXDOP 1-re van állítva, a lekérdezést egyetlen szál hajtja végre.
Permissions
A CTAS engedélyt SELECT igényel minden select_criteria-ben hivatkozott objektumhoz.
A tábla létrehozásához szükséges engedélyekről lásd: Jogosultságok a .CREATE TABLE
Megjegyzések
Részletekért lásd az Általános megjegyzéseket .CREATE TABLE
Korlátozások és korlátozások
További részletekért a korlátozásokról lásd a Korlátozások és korlátozások (Korlátozások és korlátozások ) oldalon CREATE TABLE.
Rendezett, klaszterizált columnstore index létrehozható bármely Azure Synapse Analytics által támogatott adattípus oszlopán, kivéve a string oszlopokat.
A SET ROWCOUNT (Transact-SQL) nem befolyásolja a CTAS-t. Hasonló viselkedés eléréséhez használja TOP (Transact-SQL).
A
OPENJSONCTAS nem támogatja eztSELECTa függvényt az utasítás részeként. Alternatívaként használdINSERT INTO ... SELECT. Például:DECLARE @json NVARCHAR(MAX) = N' [ { "id": 1, "name": "Alice", "age": 30, "address": { "street": "123 Main St", "city": "Wonderland" } }, { "id": 2, "name": "Bob", "age": 25, "address": { "street": "456 Elm St", "city": "Gotham" } } ]'; INSERT INTO Users (id, name, age, street, city) SELECT id, name, age, JSON_VALUE(address, '$.street') AS street, JSON_VALUE(address, '$.city') AS city FROM OPENJSON(@json) WITH ( id INT, name NVARCHAR(50), age INT, address NVARCHAR(MAX) AS JSON );
Zárolási viselkedés
Részletekért lásd: Viselkedés zárolása .CREATE TABLE
Performance
Hash-elosztott tábla esetén CTAS segítségével választhatsz egy másik eloszlási oszlopot, hogy jobb teljesítményt érj el az összekapcsolások és aggregációk esetében. Ha nem a célod, hogy másik eloszlási oszlopot válassz, akkor a legjobb CTAS teljesítményt akkor éred el, ha ugyanazt az eloszlási oszlopot jelöled meg, mert így elkerülöd a sorok újraelosztását.
Ha CTAS-t használsz tábla létrehozásához, és a teljesítmény nem tényező, akkor megadhatod ROUND_ROBIN , hogy elkerüld az elosztási oszlop kiválasztását.
Az adatmozgás elkerülése érdekében a következő lekérdezésekben REPLICATE megadhatod a megnövelt tárhely árán, hogy minden Compute csomóponton teljes táblázatmásolatot töltsön be.
Példák táblázat másolására
A. Használj CTAS táblázat másolására
Apply to: Azure Synapse Analytics and Analytics Platform System (PDW)
Talán az egyik leggyakoribb felhasználási CTAS módja, hogy egy táblázat másolatát készítsünk, hogy módosíthasd a DDL-t. Ha például eredetileg létrehoztad a táblát mint ROUND_ROBIN a-ként, és most egy oszlopon elosztott táblára akarod változtatni, CTAS így változtatnád meg az elosztási oszlopot.
CTAS használható partíciók, indexolás vagy oszloptípusok megváltoztatására is.
Tegyük fel, hogy létrehoztad ezt a táblát úgy, hogy megadod HEAP és használod az alapértelmezett eloszlás típust.ROUND_ROBIN
CREATE TABLE FactInternetSales
(
ProductKey INT NOT NULL,
OrderDateKey INT NOT NULL,
DueDateKey INT NOT NULL,
ShipDateKey INT NOT NULL,
CustomerKey INT NOT NULL,
PromotionKey INT NOT NULL,
CurrencyKey INT NOT NULL,
SalesTerritoryKey INT NOT NULL,
SalesOrderNumber NVARCHAR(20) NOT NULL,
SalesOrderLineNumber TINYINT NOT NULL,
RevisionNumber TINYINT NOT NULL,
OrderQuantity SMALLINT NOT NULL,
UnitPrice MONEY NOT NULL,
ExtendedAmount MONEY NOT NULL,
UnitPriceDiscountPct FLOAT NOT NULL,
DiscountAmount FLOAT NOT NULL,
ProductStandardCost MONEY NOT NULL,
TotalProductCost MONEY NOT NULL,
SalesAmount MONEY NOT NULL,
TaxAmt MONEY NOT NULL,
Freight MONEY NOT NULL,
CarrierTrackingNumber NVARCHAR(25),
CustomerPONumber NVARCHAR(25)
)
WITH(
HEAP,
DISTRIBUTION = ROUND_ROBIN
);
Most egy új példányt szeretnél létrehozni ebből a táblázatból klaszterizált columnstore indexkel, hogy kihasználhasd a klaszterezett columnstore táblák teljesítményét. Ezt a táblázatot is érdemes elosztaniProductKey, mivel erre az oszlopra számítasz, hogy csatlakozásokat látsz, és elkerüld az adatmozgást a csatlakozások során .ProductKey Végül pedig érdemes partíciót is bekapcsolni OrderDateKey , hogy gyorsan törölhesd a régi adatokat a régi partíciók eltávolításával. Íme a CTAS nyilatkozat, amely a régi tábládat egy új táblába másolná:
CREATE TABLE FactInternetSales_new
WITH
(
CLUSTERED COLUMNSTORE INDEX,
DISTRIBUTION = HASH(ProductKey),
PARTITION
(
OrderDateKey RANGE RIGHT FOR VALUES
(
20000101,20010101,20020101,20030101,20040101,20050101,20060101,20070101,20080101,20090101,
20100101,20110101,20120101,20130101,20140101,20150101,20160101,20170101,20180101,20190101,
20200101,20210101,20220101,20230101,20240101,20250101,20260101,20270101,20280101,20290101
)
)
)
AS SELECT * FROM FactInternetSales;
Végül átnevezheted a tábláidat, hogy az új táblát cseréld, majd ledobd a régi táblát.
RENAME OBJECT FactInternetSales TO FactInternetSales_old;
RENAME OBJECT FactInternetSales_new TO FactInternetSales;
DROP TABLE FactInternetSales_old;
Példák oszlopopciókra
B. Használj CTAS oszlopattribútumok megváltoztatására
Apply to: Azure Synapse Analytics and Analytics Platform System (PDW)
Ez a példa a CTAS segítségével módosítja az adattípusokat, nullitást és az összeállítást a táblázat több oszlopában DimCustomer2 .
-- Original table
CREATE TABLE [dbo].[DimCustomer2] (
[CustomerKey] INT NOT NULL,
[GeographyKey] INT NULL,
[CustomerAlternateKey] nvarchar(15) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL
)
WITH (CLUSTERED COLUMNSTORE INDEX, DISTRIBUTION = HASH([CustomerKey]));
-- CTAS example to change data types, nullability, and column collations
CREATE TABLE test
WITH (HEAP, DISTRIBUTION = ROUND_ROBIN)
AS
SELECT
CustomerKey AS CustomerKeyNoChange,
CustomerKey*1 AS CustomerKeyChangeNullable,
CAST(CustomerKey AS DECIMAL(10,2)) AS CustomerKeyChangeDataTypeNullable,
ISNULL(CAST(CustomerKey AS DECIMAL(10,2)),0) AS CustomerKeyChangeDataTypeNotNullable,
GeographyKey AS GeographyKeyNoChange,
ISNULL(GeographyKey,0) AS GeographyKeyChangeNotNullable,
CustomerAlternateKey AS CustomerAlternateKeyNoChange,
CASE WHEN CustomerAlternateKey = CustomerAlternateKey
THEN CustomerAlternateKey END AS CustomerAlternateKeyNullable,
CustomerAlternateKey COLLATE Latin1_General_CS_AS_KS_WS AS CustomerAlternateKeyChangeCollation
FROM [dbo].[DimCustomer2]
-- Resulting table
CREATE TABLE [dbo].[test] (
[CustomerKeyNoChange] INT NOT NULL,
[CustomerKeyChangeNullable] INT NULL,
[CustomerKeyChangeDataTypeNullable] DECIMAL(10, 2) NULL,
[CustomerKeyChangeDataTypeNotNullable] DECIMAL(10, 2) NOT NULL,
[GeographyKeyNoChange] INT NULL,
[GeographyKeyChangeNotNullable] INT NOT NULL,
[CustomerAlternateKeyNoChange] NVARCHAR(15) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
[CustomerAlternateKeyNullable] NVARCHAR(15) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[CustomerAlternateKeyChangeCollation] NVARCHAR(15) COLLATE Latin1_General_CS_AS_KS_WS NOT NULL
)
WITH (DISTRIBUTION = ROUND_ROBIN);
Utolsó lépésként használhatod a RENAME (Transact-SQL ) gombot a táblanevek megváltoztatására. Ez teszi a DimCustomer2-t az új asztalra.
RENAME OBJECT DimCustomer2 TO DimCustomer2_old;
RENAME OBJECT test TO DimCustomer2;
DROP TABLE DimCustomer2_old;
Példák a táblázateloszlásra
C. Használd a CTAS-t egy táblázat elosztási módszerének megváltoztatására
Apply to: Azure Synapse Analytics and Analytics Platform System (PDW)
Ez az egyszerű példa megmutatja, hogyan lehet megváltoztatni egy táblázat eloszlási módszerét. Hogy megmutassa, hogyan lehet ezt megvalósítani, egy hash-elosztott táblázatot körrendszerre változtat, majd visszaváltoztatja a kör-robin táblázatot hash distributedre. A végső asztal megegyezik az eredeti táblázattal.
A legtöbb esetben nem kell hash-elosztott táblát körös táblázatra változtatni. Gyakrabban előfordulhat, hogy körrendszeres táblázatot kell átalakítani hash elosztott táblára. Például először egy új táblát tölthetsz round-robinként, majd később áthelyezheted egy hash-elosztott táblára, hogy jobb csatlakozási teljesítményt érj el.
Ez a példa az AdventureWorksDW mintaadatbázist használja. Az Azure Synapse Analytics verzió betöltéséhez lásd: Quickstart: Create and query a dedicated SQL pool (korábban SQL DW) Azure Synapse Analytics-ben az Azure portál segítségével.
-- DimSalesTerritory is hash-distributed.
-- Copy it to a round-robin table.
CREATE TABLE [dbo].[myTable]
WITH
(
CLUSTERED COLUMNSTORE INDEX,
DISTRIBUTION = ROUND_ROBIN
)
AS SELECT * FROM [dbo].[DimSalesTerritory];
-- Switch table names
RENAME OBJECT [dbo].[DimSalesTerritory] to [DimSalesTerritory_old];
RENAME OBJECT [dbo].[myTable] TO [DimSalesTerritory];
DROP TABLE [dbo].[DimSalesTerritory_old];
Ezután változtasd vissza hash elosztott táblára.
-- You just made DimSalesTerritory a round-robin table.
-- Change it back to the original hash-distributed table.
CREATE TABLE [dbo].[myTable]
WITH
(
CLUSTERED COLUMNSTORE INDEX,
DISTRIBUTION = HASH(SalesTerritoryKey)
)
AS SELECT * FROM [dbo].[DimSalesTerritory];
-- Switch table names
RENAME OBJECT [dbo].[DimSalesTerritory] to [DimSalesTerritory_old];
RENAME OBJECT [dbo].[myTable] TO [DimSalesTerritory];
DROP TABLE [dbo].[DimSalesTerritory_old];
D. Használj CTAS-t egy tábla replikált táblává alakításához
Apply to: Azure Synapse Analytics and Analytics Platform System (PDW)
Ez a példa kör- vagy hash-elosztott táblák replikált táblára történő átalakítására alkalmazható. Ez a konkrét példa egy lépéssel tovább viszi az előző módszert, amellyel az eloszlás típusát módosították. Mivel DimSalesTerritory dimenzióról van szó, és valószínűleg kisebb tábla, választhatod, hogy újrahozod a táblát replikált, hogy elkerüld az adatmozgást más táblákhoz való csatlakozáskor.
-- DimSalesTerritory is hash-distributed.
-- Copy it to a replicated table.
CREATE TABLE [dbo].[myTable]
WITH
(
CLUSTERED COLUMNSTORE INDEX,
DISTRIBUTION = REPLICATE
)
AS SELECT * FROM [dbo].[DimSalesTerritory];
-- Switch table names
RENAME OBJECT [dbo].[DimSalesTerritory] to [DimSalesTerritory_old];
RENAME OBJECT [dbo].[myTable] TO [DimSalesTerritory];
DROP TABLE [dbo].[DimSalesTerritory_old];
E. Használj CTAS-t egy táblázat létrehozására, amelyből kevesebb oszlop van
Apply to: Azure Synapse Analytics and Analytics Platform System (PDW)
A következő példa egy kör-robin elosztott táblát hoz létre .myTable (c, ln) Az új táblázatban csak két oszlop van. A SELECT utasításban szereplő oszlop alias-okat használja az oszlopok nevéhez.
CREATE TABLE myTable
WITH
(
CLUSTERED COLUMNSTORE INDEX,
DISTRIBUTION = ROUND_ROBIN
)
AS SELECT CustomerKey AS c, LastName AS ln
FROM dimCustomer;
Példák lekérdezési tippekhez
F. Használj lekérdezési tippet a CREATE TABLE AS SELECT (CTAS) opcióval
Apply to: Azure Synapse Analytics and Analytics Platform System (PDW)
Ez a lekérdezés az alapvető szintaxist mutatja a lekérdezési csatlakozási tipp CTAS állítással való használathoz. A lekérdezés benyújtása után az Azure Synapse Analytics alkalmazza a hash join stratégiát, amikor minden egyes disztúcióhoz a lekérdezési tervet generálja. További információért a hash join lekérdezési tippről lásd: OPTION Clause (Transact-SQL).
CREATE TABLE dbo.FactInternetSalesNew
WITH
(
CLUSTERED COLUMNSTORE INDEX,
DISTRIBUTION = ROUND_ROBIN
)
AS SELECT T1.* FROM dbo.FactInternetSales T1 JOIN dbo.DimCustomer T2
ON ( T1.CustomerKey = T2.CustomerKey )
OPTION ( HASH JOIN );
Példák külső táblákra
G. Use CTAS to import data from Azure Blob storage
Apply to: Azure Synapse Analytics and Analytics Platform System (PDW)
Adatimportáláshoz külső táblából használd a CREATE TABLE AS SELECT gombot, hogy külső táblából válassz. Az adat külső táblából Azure Synapse Analyticsbe való kiválasztásához szükséges szintaxis, mint a normál táblából történő adatválasztás szintaxisa.
Az alábbi példa egy külső táblát határoz meg az Azure Blob Storage fiók adatain. Ezután a CREATE TABLE AS SELECT funkcióval választhat a külső táblából választani. Ez importálja az adatokat az Azure Blob Storage szöveg-dedivided fájljaiból, és tárolja az adatokat egy új Azure Synapse Analytics táblába.
--Use your own processes to create the text-delimited files on Azure Blob Storage.
--Create the external table called ClickStream.
CREATE EXTERNAL TABLE ClickStreamExt (
url VARCHAR(50),
event_date DATE,
user_IP VARCHAR(50)
)
WITH (
LOCATION='/logs/clickstream/2015/',
DATA_SOURCE = MyAzureStorage,
FILE_FORMAT = TextFileFormat)
;
--Use CREATE TABLE AS SELECT to import the Azure Blob Storage data into a new
--Synapse Analytics table called ClickStreamData
CREATE TABLE ClickStreamData
WITH
(
CLUSTERED COLUMNSTORE INDEX,
DISTRIBUTION = HASH (user_IP)
)
AS SELECT * FROM ClickStreamExt
;
H. Használj CTAS-t Hadoop adatok importálására egy külső táblából
Vonatkozik: Analytics Platform System (PDW)
Adatimportáláshoz külső táblából egyszerűen használd a CREATE TABLE AS SELECT opciót, hogy válassz a külső táblából. A szintaxis, amellyel az adatot külső táblából kiválasztják az Analytics Platform Systembe (PDW), ugyanaz, mint a szintaxis, amely egy normál táblából történő adatválasztás szintaxisa volt.
A következő példa egy külső táblát határoz meg egy Hadoop klaszteren. Ezután a CREATE TABLE AS SELECT funkcióval választhat a külső táblából választani. Ez importálja az adatokat a Hadoop szöveges fájljaiból, és egy új Analytics Platform System (PDW) táblába tárolja.
-- Create the external table called ClickStream.
CREATE EXTERNAL TABLE ClickStreamExt (
url VARCHAR(50),
event_date DATE,
user_IP VARCHAR(50)
)
WITH (
LOCATION = 'hdfs://MyHadoop:5000/tpch1GB/employee.tbl',
FORMAT_OPTIONS ( FIELD_TERMINATOR = '|')
)
;
-- Use your own processes to create the Hadoop text-delimited files
-- on the Hadoop Cluster.
-- Use CREATE TABLE AS SELECT to import the Hadoop data into a new
-- table called ClickStreamPDW
CREATE TABLE ClickStreamPDW
WITH
(
CLUSTERED COLUMNSTORE INDEX,
DISTRIBUTION = HASH (user_IP)
)
AS SELECT * FROM ClickStreamExt
;
Példák CTAS használatával SQL Server kód helyettesítésére
Használj CTAS-t, hogy megkerüld néhány nem támogatott funkciót. A kód futtatása az adatraktáron kívül a meglévő kód átírása CTAS használatra általában javítja a teljesítményt. Ez a teljesen párhuzamos kialakításának eredménye.
Megjegyzés:
Próbálj meg gondolkodni, hogy "először CTAS". Ha úgy gondolod, hogy egy problémát meg tudsz oldani CTAS , akkor általában ez a legjobb megközelítés – még akkor is, ha több adatot írsz emiatt.
I. Használj CTAS a SELECT helyett.. BA
Apply to: Azure Synapse Analytics and Analytics Platform System (PDW)
Az SQL Server kód általában a SELECT.. INTO egy SELECT utasítás eredményeivel tölti fel a táblát. Ez egy példa SQL Server SELECT-re.. KIJELENTÉS.
SELECT *
INTO #tmp_fct
FROM [dbo].[FactInternetSales]
Ez a szintaxis nem támogatott az Azure Synapse Analytics és a Parallel Data Warehouse programokban. Ez a példa megmutatja, hogyan lehet újraírni az előző SELECT-et.. INTO nyilatkozat CTAS nyilatkozatként. Választhatsz bármelyik CTAS szintaxisban leírt TERJESZTÉSI opciók közül. Ez a példa a ROUND_ROBIN eloszlási módszert használja.
CREATE TABLE #tmp_fct
WITH
(
DISTRIBUTION = ROUND_ROBIN
)
AS
SELECT *
FROM [dbo].[FactInternetSales]
;
J. Használjon CTAS az egyesítési utasítások egyszerűsítésére
Apply to: Azure Synapse Analytics and Analytics Platform System (PDW)
Az egyesítési utasítások legalább részben helyettesíthetők .CTAS Össze lehet konszolidálni a INSERT és - UPDATE t egyetlen állításba. A törölt nyilvántartásokat egy második nyilatkozatban le kell zárni.
Egy példa UPSERT a következőkre:
CREATE TABLE dbo.[DimProduct_upsert]
WITH
( DISTRIBUTION = HASH([ProductKey])
, CLUSTERED INDEX ([ProductKey])
)
AS
-- New rows and new versions of rows
SELECT s.[ProductKey]
, s.[EnglishProductName]
, s.[Color]
FROM dbo.[stg_DimProduct] AS s
UNION ALL
-- Keep rows that are not being touched
SELECT p.[ProductKey]
, p.[EnglishProductName]
, p.[Color]
FROM dbo.[DimProduct] AS p
WHERE NOT EXISTS
( SELECT *
FROM [dbo].[stg_DimProduct] s
WHERE s.[ProductKey] = p.[ProductKey]
)
;
RENAME OBJECT dbo.[DimProduct] TO [DimProduct_old];
RENAME OBJECT dbo.[DimProduct_upsert] TO [DimProduct];
K. Kifejezetten kimondjuk az adattípust és a kimenet nullabilitását
Apply to: Azure Synapse Analytics and Analytics Platform System (PDW)
Amikor SQL Server kódot migrálsz Azure Synapse Analyticsre, előfordulhat, hogy ilyen típusú kódolási mintázattal találkozhatsz:
DECLARE @d DECIMAL(7,2) = 85.455
, @f FLOAT(24) = 85.455
CREATE TABLE result
(result DECIMAL(7,2) NOT NULL
)
WITH (DISTRIBUTION = ROUND_ROBIN)
INSERT INTO result
SELECT @d*@f
;
Ösztönösen azt gondolhatod, hogy ezt a kódot át kellene migrálnod egy CTAS-re, és igaza lenne. Azonban van itt egy rejtett probléma.
A következő kód NEM adja ugyanazt az eredményt:
DECLARE @d DECIMAL(7,2) = 85.455
, @f FLOAT(24) = 85.455
;
CREATE TABLE ctas_r
WITH (DISTRIBUTION = ROUND_ROBIN)
AS
SELECT @d*@f as result
;
Figyeljük meg, hogy az "eredmény" oszlop továbbviszi az adott kifejezés adattípusát és nullabilitási értékeit. Ez finom értékbeli eltérésekhez vezethet, ha nem vagy óvatos.
Próbáld meg példáként a következőket:
SELECT result,result*@d
from result
;
SELECT result,result*@d
from ctas_r
;
Az eredményhez tárolt érték más. Ahogy az eredményoszlopban megmaradt értéket más kifejezésekben használják, a hiba még jelentősebbé válik.
Ez fontos az adatmigrációk esetén. Bár a második lekérdezés vitathatatlanul pontosabb, mégis van egy probléma. Az adatok eltérnének a forrásrendszerétől, ami kérdéseket vet fel a migráció integritásával kapcsolatban. Ez az egyik olyan ritka eset, amikor a "rossz" válasz valójában a helyes!
Ennek az aránynak a két eredmény közötti különbség az implicit típusszereplés miatt van. Az első példában a táblázat határozza meg az oszlop definícióját. Amikor a sort beillesztjük, implicit típusváltás történik. A második példában nincs implicit típusátalakítás, mivel az kifejezés határozza meg az oszlop adattípusát. Figyeljük meg azt is, hogy a második példában az oszlop NULL oszlopként van meghatározva, míg az első példában nem. Amikor a táblát az első példaoszlopban létrehozták, a nullitás egyértelműen definiálódott. A második példában ez az kifejezésre volt bízva, és alapértelmezés szerint ez definíciót NULL eredményezett.
E problémák megoldásához kifejezetten be kell állítanod a típusátváltást és a nullitást az SELECT utasítás azon részében CTAS . Ezeket a tulajdonságokat nem lehet beállítani a tábla létrehozása részben.
Ez a példa bemutatja, hogyan lehet a kódot javítani:
DECLARE @d DECIMAL(7,2) = 85.455
, @f FLOAT(24) = 85.455
CREATE TABLE ctas_r
WITH (DISTRIBUTION = ROUND_ROBIN)
AS
SELECT ISNULL(CAST(@d*@f AS DECIMAL(7,2)),0) as result
Figyeljük meg a példában a következőket:
- Használhatók lehetett volna a CAST vagy CONVERT (CAST) vagy a CONVERT (CAST) (U
- Az ISNULL a NULLability kényszerítésére szolgál, nem a COALESCE-re.
- Az ISNULL a legkülső funkció.
- Az ISNULL második része egy állandó,
0.
Megjegyzés:
Ahhoz, hogy a nullability helyesen be legyen állítva, elengedhetetlen használni ISNULL , és nem COALESCE.
COALESCE nem determinisztikus függvény, így az kifejezés eredménye mindig nulla lesz.
ISNULL más. Ez determinisztika. Ezért, ha a ISNULL függvény második része állandó vagy literális, akkor az eredmény NEM NULL.
Ez a tipp nemcsak a számítások integritásának biztosításához hasznos. Ez fontos a táblázatos partícióváltásnál is. Képzeld el, hogy ezt a táblázatot a tényként definiálod:
CREATE TABLE [dbo].[Sales]
(
[date] INT NOT NULL
, [product] INT NOT NULL
, [store] INT NOT NULL
, [quantity] INT NOT NULL
, [price] MONEY NOT NULL
, [amount] MONEY NOT NULL
)
WITH
( DISTRIBUTION = HASH([product])
, PARTITION ( [date] RANGE RIGHT FOR VALUES
(20000101,20010101,20020101
,20030101,20040101,20050101
)
)
)
;
Az értékmező azonban egy számított kifejezés, nem része a forrásadatoknak.
A partíciós adathalmazod létrehozásához vegyük a következő példát:
CREATE TABLE [dbo].[Sales_in]
WITH
( DISTRIBUTION = HASH([product])
, PARTITION ( [date] RANGE RIGHT FOR VALUES
(20000101,20010101
)
)
)
AS
SELECT
[date]
, [product]
, [store]
, [quantity]
, [price]
, [quantity]*[price] AS [amount]
FROM [stg].[source]
OPTION (LABEL = 'CTAS : Partition IN table : Create')
;
A lekérdezés tökéletesen működött. A probléma akkor jelentkezik, amikor megpróbálod végrehajtani a partíciós kapcsolót. A táblázat definíciói nem egyeznek. A táblázat definícióinak elkészítéséhez a CTAS-t módosítani kell.
CREATE TABLE [dbo].[Sales_in]
WITH
( DISTRIBUTION = HASH([product])
, PARTITION ( [date] RANGE RIGHT FOR VALUES
(20000101,20010101
)
)
)
AS
SELECT
[date]
, [product]
, [store]
, [quantity]
, [price]
, ISNULL(CAST([quantity]*[price] AS MONEY),0) AS [amount]
FROM [stg].[source]
OPTION (LABEL = 'CTAS : Partition IN table : Create');
Így látható, hogy a típuskonzisztens és nullabithetőségi tulajdonságok fenntartása a CTAS-on jó mérnöki legjobb gyakorlat. Segít megőrizni a számítások integritását, és biztosítja, hogy a partíciós kapcsolás is lehetséges.
L. Rendezett klaszteres oszloptároló indexet hozz létre a MAXDOP 1-gyel
CREATE TABLE Table1 WITH (DISTRIBUTION = HASH(c1), CLUSTERED COLUMNSTORE INDEX ORDER(c1) )
AS SELECT * FROM ExampleTable
OPTION (MAXDOP 1);
Kapcsolódó tartalom
- KÜLSŐ ADATFORRÁS LÉTREHOZÁSA (Transact-SQL)
- KÜLSŐ FÁJLFORMÁTUM LÉTREHOZÁSA (Transact-SQL)
- HOZZON LÉTRE KÜLSŐ TÁBLÁT (Transact-SQL)
- KÜLSŐ TÁBLA LÉTREHOZÁSA SELECT (Transact-SQL)
- CREATE TABLE (Azure Synapse Analytics)
- DROP TABLE (Transact-SQL)
- KÜLSŐ TÁBLA (Transact-SQL)
- ALTERNATÍV TÁBLÁZAT (Transact-SQL)
- KÜLSŐ TÁBLA MÓDOSÍTÁSA (Transact-SQL)
A következőkre vonatkozik:Warehouse a Microsoft Fabric
CREATE TABLE AS SELECT (CTAS) az egyik legfontosabb elérhető T-SQL funkció. Ez egy teljesen párhuzamos művelet, amely egy új táblát hoz létre egy SELECT utasítás kimenete alapján. A CTAS a legegyszerűbb és leggyorsabb módja annak, hogy táblázat másolatát készítsünk.
Például a Microsoft Fabric Warehouse CTAS használatával a következőképpen használható:
- Készíts egy táblázatmásolatot a forrástábla néhány oszlopával.
- Hozz létre egy táblát, amely egy lekérdezés eredménye, amely más táblákat egyesít.
További információért a CTAS használatáról a Microsoft Fabric-ben található Warehouse-ban a Transact-SQL segítségével olvasható: Adatfelvétel a raktárba a Raktárba.
Megjegyzés:
Mivel CREATE TABLE AS SELECT a (CTAS) növeli a tábla létrehozásának lehetőségeit, ez a téma igyekszik nem ismételni a CREATE TABLE témát. Ehelyett a CTAS és a CREATE TABLE közötti különbségeket írja le.
Transact-SQL szintaxis konvenciók
Szemantika
CREATE TABLE { warehouse_name.schema_name.table_name | schema_name.table_name | table_name } (
) WITH (CLUSTER BY [ ,... n ])
AS <select_statement>
[;]
<select_statement> ::=
SELECT select_criteria
Arguments
A gyakori érvekről szóló részletekért lásd a Microsoft Fabric CREATE TABLE argumentjai.
AHOL (KLASZTERREL [ ,... n])
A CLUSTER BY Fabric Data Warehouse adatklaszterezésére vonatkozó záradék legalább egy oszlopot megköveteli, és legfeljebb négy oszlopot kell megadni.
További információért lásd: Data clustering in Fabric Data Warehouse.
SELECT utasítás
Ez az SELECT állítás az alapvető különbség a CTAS és CREATE TABLE.
SELECT select_criteria
Az új táblázatot egy kijelentés eredményeivel SELECT tölti fel.
select_criteria az állítás teste SELECT , amely meghatározza, mely adatokat kell másolni az új táblába. Az állításokról információért SELECT lásd: SELECT (Transact-SQL).
Megjegyzés:
A Microsoft Fabricben a változók használata a CTAS-ban nem engedélyezett.
Permissions
A CTAS engedélyt SELECT igényel minden select_criteria-ben hivatkozott objektumhoz.
A tábla létrehozásához szükséges engedélyekről lásd: Jogosultságok a .CREATE TABLE
Megjegyzések
Részletekért lásd az Általános megjegyzéseket .CREATE TABLE
Korlátozások és korlátozások
A SET ROWCOUNT (Transact-SQL) nem befolyásolja a CTAS-t. Hasonló viselkedés eléréséhez használja TOP (Transact-SQL).
Részletekért lásd a Korlátozások és Korlátozások (Korlátozások és korlátozások ) oldalon CREATE TABLE.
Zárolási viselkedés
Részletekért lásd: Viselkedés zárolása .CREATE TABLE
Példák táblázat másolására
További információért a CTAS használatáról a Microsoft Fabric-ben található Warehouse-ban a Transact-SQL segítségével olvasható: Adatfelvétel a raktárba a Raktárba.
A. Használj CTAS oszlopattribútumok megváltoztatására
Ez a példa a DimCustomer2 CTAS segítségével módosítja az adattípusokat és a nullabilitást több oszlop esetében a táblázatban.
-- Original table
CREATE TABLE [dbo].[DimCustomer2] (
[CustomerKey] INT NOT NULL,
[GeographyKey] INT NULL,
[CustomerAlternateKey] VARCHAR(15)NOT NULL
)
-- CTAS example to change data types and nullability of columns
CREATE TABLE test
AS
SELECT
CustomerKey AS CustomerKeyNoChange,
CustomerKey*1 AS CustomerKeyChangeNullable,
CAST(CustomerKey AS DECIMAL(10,2)) AS CustomerKeyChangeDataTypeNullable,
ISNULL(CAST(CustomerKey AS DECIMAL(10,2)),0) AS CustomerKeyChangeDataTypeNotNullable,
GeographyKey AS GeographyKeyNoChange,
ISNULL(GeographyKey,0) AS GeographyKeyChangeNotNullable,
CustomerAlternateKey AS CustomerAlternateKeyNoChange,
CASE WHEN CustomerAlternateKey = CustomerAlternateKey
THEN CustomerAlternateKey END AS CustomerAlternateKeyNullable,
FROM [dbo].[DimCustomer2]
-- Resulting table
CREATE TABLE [dbo].[test] (
[CustomerKeyNoChange] INT NOT NULL,
[CustomerKeyChangeNullable] INT NULL,
[CustomerKeyChangeDataTypeNullable] DECIMAL(10, 2) NULL,
[CustomerKeyChangeDataTypeNotNullable] DECIMAL(10, 2) NOT NULL,
[GeographyKeyNoChange] INT NULL,
[GeographyKeyChangeNotNullable] INT NOT NULL,
[CustomerAlternateKeyNoChange] VARCHAR(15) NOT NULL,
[CustomerAlternateKeyNullable] VARCHAR(15) NULL,
NOT NULL
)
B. Használj CTAS-t egy táblázat létrehozására, amelyből kevesebb oszlop van
A következő példa egy táblát hoz létre .myTable (c, ln) Az új táblázatban csak két oszlop van. A SELECT utasításban szereplő oszlop alias-okat használja az oszlopok nevéhez.
CREATE TABLE myTable
AS SELECT CustomerKey AS c, LastName AS ln
FROM dimCustomer;
C. Használj CTAS a SELECT helyett.. BA
Az SQL Server kód általában a SELECT.. INTO egy SELECT utasítás eredményeivel tölti fel a táblát. Ez egy példa SQL Server SELECT-re.. KIJELENTÉS.
SELECT *
INTO NewFactTable
FROM [dbo].[FactInternetSales]
Ez a példa megmutatja, hogyan lehet újraírni az előző SELECT-et.. INTO nyilatkozat CTAS nyilatkozatként.
CREATE TABLE NewFactTable
AS
SELECT *
FROM [dbo].[FactInternetSales]
;
D. Használjon CTAS az egyesítési utasítások egyszerűsítésére
Az egyesítési utasítások legalább részben helyettesíthetők .CTAS Össze lehet konszolidálni a INSERT és - UPDATE t egyetlen állításba. A törölt nyilvántartásokat egy második nyilatkozatban le kell zárni.
Egy példa UPSERT a következőkre:
CREATE TABLE dbo.[DimProduct_upsert]
AS
-- New rows and new versions of rows
SELECT s.[ProductKey]
, s.[EnglishProductName]
, s.[Color]
FROM dbo.[stg_DimProduct] AS s
UNION ALL
-- Keep rows that are not being touched
SELECT p.[ProductKey]
, p.[EnglishProductName]
, p.[Color]
FROM dbo.[DimProduct] AS p
WHERE NOT EXISTS
( SELECT *
FROM [dbo].[stg_DimProduct] s
WHERE s.[ProductKey] = p.[ProductKey]
)
;
D. Készíts egy táblázatot adatklaszterezéssel
A következő parancsot használva létrehozhat új tábla CREATE TABLE AS SELECT (CTAS) segítségével, amelynek adatcsoportos oszlopa van megadva:
CREATE TABLE nyctlc_With_DataClustering
WITH (CLUSTER BY (lpepPickupDatetime))
AS SELECT * FROM nyctlc;
További információért lásd: Data clustering in Fabric Data Warehouse.