CREATE TABLE AS SELECT
Şunlar için geçerlidir:Azure Synapse AnalyticsPlatform Sistemi (PDW)
CREATE TABLE AS SELECT (CTAS), kullanılabilir en önemli T-SQL özelliklerinden biridir. Bu SELECT deyiminin çıkışı temelinde yeni tablo oluşturan, tümüyle paralelleştirilmiş bir işlemdir. CTAS, tablonun kopyasını oluşturmanın en basit ve en hızlı yoludur.
Örneğin, aşağıdakileri yapmak için CTAS kullanın:
- Farklı bir karma dağıtım sütununa sahip bir tabloyu yeniden oluşturun.
- Tabloyu çoğaltılmış olarak yeniden oluşturun.
- Tablodaki sütunlardan yalnızca bazılarında columnstore dizini oluşturun.
- Dış verileri sorgulama veya içeri aktarma.
Not
CTAS, tablo oluşturma özelliklerini eklediğinden, bu konu CREATE TABLE konusunu yinelememeye çalışır. Bunun yerine, CTAS ve CREATE TABLE deyimleri arasındaki farkları açıklar. CREATE TABLE ayrıntıları için bkz. CREATE TABLE (Azure Synapse Analytics) deyimi.
- Bu söz dizimi, Azure Synapse Analytics'te sunucusuz SQL havuzu tarafından desteklenmez.
- CTAS, Microsoft Fabric'teki Ambar'da desteklenir.
Transact-SQL söz dizimi kuralları
Söz dizimi
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
}
Bağımsız değişkenler
Ayrıntılar için CREATE TABLE'daki Bağımsız Değişkenler bölümüne bakın.
Sütun seçenekleri
column_name
[ ,...n
]
Sütun adları CREATE TABLE'da belirtilen sütun seçeneklerine izin vermez. Bunun yerine, yeni tablo için bir veya daha fazla sütun adının isteğe bağlı bir listesini sağlayabilirsiniz. Yeni tablodaki sütunlar belirttiğiniz adları kullanır. Sütun adlarını belirttiğinizde, sütun listesindeki sütun sayısı seçme sonuçlarındaki sütun sayısıyla eşleşmelidir. Herhangi bir sütun adı belirtmezseniz, yeni hedef tablo select deyimi sonuçlarında sütun adlarını kullanır.
Veri türleri, harmanlama veya null atanabilirlik gibi diğer sütun seçeneklerini belirtemezsiniz. Bu özniteliklerin her biri deyiminin sonuçlarından SELECT
türetilir. Ancak, öznitelikleri değiştirmek için SELECT deyimini kullanabilirsiniz. Örnek için bkz. Sütun özniteliklerini değiştirmek için CTAS kullanma.
Tablo dağıtım seçenekleri
Ayrıntılar ve en iyi dağıtım sütununun nasıl seçileceğini anlamak için CREATE TABLE'daki Tablo dağıtım seçenekleri bölümüne bakın. Gerçek kullanımı veya örnek sorguları temel alan bir tablo için hangi dağıtımın seçileceğine ilişkin öneriler için bkz. Azure Synapse SQL'de Dağıtım Danışmanı.
DISTRIBUTION
= HASH
(distribution_column_name) | ROUND_ROBIN | ÇOĞALTMA CTAS deyimi bir dağıtım seçeneği gerektirir ve varsayılan değerlere sahip değildir. Bu, varsayılan değerleri olan CREATE TABLE'dan farklıdır.
DISTRIBUTION = HASH ( [distribution_column_name [, ...n]] )
Satırları en fazla sekiz sütunun karma değerlerine göre dağıtarak temel tablo verilerinin daha eşit bir şekilde dağıtılmasını sağlayarak zaman içinde veri dengesizliklerini azaltır ve sorgu performansını geliştirir.
Not
- Özelliği etkinleştirmek için bu komutla veritabanının uyumluluk düzeyini 50 olarak değiştirin. Veritabanı uyumluluk düzeyini ayarlama hakkında daha fazla bilgi için bkz. ALTER DATABASE SCOPED CONFIGURATION. Örnek:
ALTER DATABASE SCOPED CONFIGURATION SET DW_COMPATIBILITY_LEVEL = 50;
- Çok sütunlu dağıtım (MCD) özelliğini devre dışı bırakmak için bu komutu çalıştırarak veritabanının uyumluluk düzeyini AUTO olarak değiştirin. Örneğin:
ALTER DATABASE SCOPED CONFIGURATION SET DW_COMPATIBILITY_LEVEL = AUTO;
Mevcut MCD tabloları kalır ancak okunamaz hale gelir. MCD tabloları üzerindeki sorgular şu hatayı döndürür: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.
- MCD tablolarına yeniden erişim kazanmak için özelliği yeniden etkinleştirin.
- Bir MCD tablosuna veri yüklemek için CTAS deyimini kullanın ve veri kaynağı Synapse SQL tabloları olmalıdır.
- MCD HEAP hedef tablolarında CTAS desteklenmez. Bunun yerine, MCD HEAP tablolarına veri yüklemek için geçici çözüm olarak INSERT SELECT kullanın.
- MCD tabloları oluşturmak üzere betik oluşturmak için SSMS'nin kullanılması şu anda SSMS sürüm 19'un ötesinde desteklenmektedir.
Ayrıntılar ve en iyi dağıtım sütununun nasıl seçileceğini anlamak için CREATE TABLE'daki Tablo dağıtım seçenekleri bölümüne bakın.
Tablo bölümü seçenekleri
CTAS deyimi, kaynak tablo bölümlenmiş olsa bile varsayılan olarak bölümlenmemiş bir tablo oluşturur. CTAS deyimiyle bölümlenmiş bir tablo oluşturmak için bölüm seçeneğini belirtmeniz gerekir.
Ayrıntılar için CREATE TABLE'daki Tablo bölümü seçenekleri bölümüne bakın.
SELECT deyimi
SELECT deyimi, CTAS ile CREATE TABLE arasındaki temel farktır.
WITH
common_table_expression
Ortak tablo ifadesi (CTE) olarak bilinen geçici adlandırılmış bir sonuç kümesi belirtir. Daha fazla bilgi için bkz . WITH common_table_expression (Transact-SQL).
SELECT
select_criteria
Yeni tabloyu select deyiminin sonuçlarıyla doldurur. select_criteria , yeni tabloya kopyalanacak verileri belirleyen SELECT deyiminin gövdesidir. SELECT deyimleri hakkında bilgi için bkz. SELECT (Transact-SQL).
Sorgu ipucu
Kullanıcılar, maksimum paralellik derecesini denetlemek için MAXDOP değerini bir tamsayı değerine ayarlayabilir. MAXDOP 1 olarak ayarlandığında, sorgu tek bir iş parçacığı tarafından yürütülür.
İzinler
CTAS, SELECT
select_criteria başvuruda bulunan nesneler üzerinde izin gerektirir.
Tablo oluşturma izinleri için bkz. CREATE TABLE'da İzinler .
Açıklamalar
Ayrıntılar için bkz. CREATE TABLE'daki Genel Açıklamalar .
Sınırlamalar ve kısıtlamalar
Sıralı kümelenmiş columnstore dizini, dize sütunları dışında Azure Synapse Analytics'te desteklenen herhangi bir veri türünün sütunlarında oluşturulabilir.
SET ROWCOUNT (Transact-SQL) CTAS üzerinde hiçbir etkiye sahip değildir. Benzer bir davranış elde etmek için TOP (Transact-SQL) kullanın.
Ayrıntılar için bkz. CREATE TABLE'daki Sınırlamalar ve Kısıtlamalar .
Kilitleme davranışı
Ayrıntılar için bkz. CREATE TABLE'da Kilitleme Davranışı .
Performans
Karma dağıtılmış bir tablo için, birleştirmeler ve toplamalar için daha iyi performans elde etmek üzere farklı bir dağıtım sütunu seçmek üzere CTAS kullanabilirsiniz. Amacınız farklı bir dağıtım sütunu seçmek değilse, satırların yeniden dağıtılmasını önlediğinden aynı dağıtım sütununu belirtirseniz en iyi CTAS performansına sahip olursunuz.
Tablo oluşturmak için CTAS kullanıyorsanız ve performans bir faktör değilse, dağıtım sütununa karar vermek zorunda kalmamayı belirtebilirsiniz ROUND_ROBIN
.
Sonraki sorgularda veri taşımayı önlemek için, her İşlem düğümüne tablonun tam bir kopyasını yüklemek için artan depolama maliyetiyle belirtebilirsiniz REPLICATE
.
Tablo kopyalama örnekleri
A. Tabloyu kopyalamak için CTAS kullanma
Şunlar için geçerlidir: Azure Synapse Analytics ve Analytics Platform Sistemi (PDW)
Belki de en yaygın kullanımlarından CTAS
biri, DDL'yi değiştirebilmeniz için tablonun bir kopyasını oluşturmaktır. Örneğin, başlangıçta tablonuzu olarak ROUND_ROBIN
oluşturduysanız ve şimdi bunu bir sütuna dağıtılmış bir tabloyla değiştirmek istiyorsanız, CTAS
dağıtım sütununu nasıl değiştirdiğinizdir. CTAS
bölümleme, dizin oluşturma veya sütun türlerini değiştirmek için de kullanılabilir.
Varsayılan dağıtım türünü belirterek HEAP
ve kullanarak bu tabloyu oluşturduğunuzu ROUND_ROBIN
varsayalım.
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
);
Şimdi kümelenmiş columnstore tablolarının performansından yararlanabilmek için kümelenmiş columnstore diziniyle bu tablonun yeni bir kopyasını oluşturmak istiyorsunuz. Ayrıca, bu sütunda ProductKey
birleştirmeler olmasını ve üzerinde birleştirmeler sırasında veri taşımasını önlemek istediğiniz için bu tabloyu üzerinde ProductKey
dağıtmak istiyorsunuz. Son olarak, eski bölümleri bırakarak eski verileri hızlı bir şekilde silebilmeniz için bölümüne bölümleme OrderDateKey
eklemek istiyorsunuz. Eski tablonuzu yeni bir tabloya kopyalayan CTAS deyimi aşağıdadır:
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;
Son olarak, yeni tablonuzda değiştirmek için tablolarınızı yeniden adlandırabilir ve ardından eski tablonuzu bırakabilirsiniz.
RENAME OBJECT FactInternetSales TO FactInternetSales_old;
RENAME OBJECT FactInternetSales_new TO FactInternetSales;
DROP TABLE FactInternetSales_old;
Sütun seçenekleri için örnekler
B. Sütun özniteliklerini değiştirmek için CTAS kullanma
Şunlar için geçerlidir: Azure Synapse Analytics ve Analytics Platform Sistemi (PDW)
Bu örnekte, tablodaki DimCustomer2
birkaç sütun için veri türlerini, null atanabilirliği ve harmanlamayı değiştirmek için CTAS kullanılır.
-- 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);
Son adım olarak, tablo adlarını değiştirmek için RENAME (Transact-SQL) kullanabilirsiniz. Bu, DimCustomer2'nin yeni tablo olmasını sağlar.
RENAME OBJECT DimCustomer2 TO DimCustomer2_old;
RENAME OBJECT test TO DimCustomer2;
DROP TABLE DimCustomer2_old;
Tablo dağıtımı örnekleri
C. Tablonun dağıtım yöntemini değiştirmek için CTAS kullanma
Şunlar için geçerlidir: Azure Synapse Analytics ve Analytics Platform Sistemi (PDW)
Bu basit örnek, bir tablonun dağıtım yönteminin nasıl değiştirileceğini gösterir. Bunun nasıl yapılacağının mekaniklerini göstermek için karma dağıtılmış bir tabloyu hepsini bir kez deneme olarak değiştirir ve sonra hepsini bir kez deneme tablosunu karma dağıtılmış olarak değiştirir. Son tablo özgün tabloyla eşleşir.
Çoğu durumda karma dağıtılmış bir tabloyu hepsini bir kez deneme tablosu olarak değiştirmeniz gerekmez. Daha sık, hepsini bir kez deneme tablosunu karma dağıtılmış tablo olarak değiştirmeniz gerekebilir. Örneğin, başlangıçta yeni bir tabloyu hepsini bir kez deneme olarak yükleyebilir ve daha sonra daha iyi birleştirme performansı elde etmek için karma dağıtılmış bir tabloya taşıyabilirsiniz.
Bu örnekte AdventureWorksDW örnek veritabanı kullanılmıştır. Azure Synapse Analytics sürümünü yüklemek için bkz. Hızlı Başlangıç: Azure portal kullanarak Azure Synapse Analytics'te ayrılmış sql havuzu (eski adı SQL DW) oluşturma ve sorgulama.
-- 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];
Ardından karma dağıtılmış tablo olarak değiştirin.
-- 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. Tabloyu çoğaltılmış tabloya dönüştürmek için CTAS kullanma
Şunlar için geçerlidir: Azure Synapse Analytics ve Analytics Platform Sistemi (PDW)
Bu örnek hepsini bir kez deneme veya karma dağıtılmış tabloları çoğaltılmış tabloya dönüştürmek için geçerlidir. Bu özel örnek, önceki dağıtım türünü değiştirme yöntemini bir adım ileri götürür. DimSalesTerritory
Boyut olduğundan ve büyük olasılıkla daha küçük bir tablo olduğundan, diğer tablolara katılırken veri hareketini önlemek için tabloyu çoğaltılmış olarak yeniden oluşturmayı seçebilirsiniz.
-- 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. Daha az sütun içeren bir tablo oluşturmak için CTAS kullanma
Şunlar için geçerlidir: Azure Synapse Analytics ve Analytics Platform Sistemi (PDW)
Aşağıdaki örnek adlı myTable (c, ln)
hepsini bir kez deneme dağıtılmış tablosu oluşturur. Yeni tabloda yalnızca iki sütun vardır. Sütunların adları için SELECT deyimindeki sütun diğer adlarını kullanır.
CREATE TABLE myTable
WITH
(
CLUSTERED COLUMNSTORE INDEX,
DISTRIBUTION = ROUND_ROBIN
)
AS SELECT CustomerKey AS c, LastName AS ln
FROM dimCustomer;
Sorgu ipuçları için örnekler
F. CREATE TABLE AS SELECT (CTAS) ile Sorgu İpucu Kullanma
Şunlar için geçerlidir: Azure Synapse Analytics ve Analytics Platform Sistemi (PDW)
Bu sorgu, CTAS deyimiyle sorgu birleştirme ipucu kullanmaya yönelik temel söz dizimini gösterir. Sorgu gönderildikten sonra Azure Synapse Analytics, her bir dağıtım için sorgu planını oluşturduğunda karma birleştirme stratejisini uygular. Karma birleştirme sorgusu ipucu hakkında daha fazla bilgi için bkz . OPTION Yan Tümcesi (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 );
Dış tablolar için örnekler
G. Azure Blob depolamadan verileri içeri aktarmak için CTAS kullanma
Şunlar için geçerlidir: Azure Synapse Analytics ve Analytics Platform Sistemi (PDW)
Dış tablodaki verileri içeri aktarmak için CREATE TABLE AS SELECT komutunu kullanarak dış tablodan seçim yapın. Dış tablodan Azure Synapse Analytics'e veri seçme söz dizimi, normal tablodan veri seçme söz dizimi ile aynıdır.
Aşağıdaki örnek, Azure Blob Depolama hesabındaki veriler üzerinde bir dış tablo tanımlar. Ardından dış tablodan seçim yapmak için CREATE TABLE AS SELECT işlevini kullanır. Bu işlem, metinle ayrılmış Azure Blob Depolama dosyalardan verileri içeri aktarır ve verileri yeni bir Azure Synapse Analytics tablosuna depolar.
--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. Dış tablodan Hadoop verilerini içeri aktarmak için CTAS kullanma
Şunlar için geçerlidir: Analiz Platformu Sistemi (PDW)
Dış tablodan verileri içeri aktarmak için, dış tablodan seçim yapmak için CREATE TABLE AS SELECT komutunu kullanmanız yeterlidir. Bir dış tablodan Analytics Platform Sistemi'ne (PDW) veri seçme söz dizimi, normal bir tablodan veri seçme söz dizimi ile aynıdır.
Aşağıdaki örnek, Hadoop kümesindeki bir dış tabloyu tanımlar. Ardından dış tablodan seçim yapmak için CREATE TABLE AS SELECT işlevini kullanır. Bu, Hadoop metinle ayrılmış dosyalardan verileri içeri aktarır ve verileri yeni bir Analytics Platform Sistemi (PDW) tablosuna depolar.
-- 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
;
SQL Server kodu değiştirmek için CTAS kullanma örnekleri
Desteklenmeyen bazı özelliklere geçici bir çözüm bulmak için CTAS kullanın. Kodunuzu veri ambarı üzerinde çalıştırabilmenin yanı sıra, mevcut kodu CTAS kullanmak için yeniden yazmak genellikle performansı artırır. Bu, tamamen paralelleştirilmiş tasarımının bir sonucudur.
Not
"Önce CTAS" düşünmeye çalışın. Kullanarak bir sorunu CTAS
çözebileceğinizi düşünüyorsanız, sonuç olarak daha fazla veri yazıyor olsanız bile bu yaklaşım genellikle en iyi yöntemdir.
I. SELECT yerine CTAS kullanın.. INTO
Şunlar için geçerlidir: Azure Synapse Analytics ve Analytics Platform Sistemi (PDW)
SQL Server kodu normalde SELECT kullanır.. BIR tabloyu SELECT deyiminin sonuçlarıyla doldurmak için INTO. Bu, SQL Server SELECT.. INTO deyimi.
SELECT *
INTO #tmp_fct
FROM [dbo].[FactInternetSales]
Bu söz dizimi Azure Synapse Analytics ve Paralel Data Warehouse'da desteklenmez. Bu örnekte, önceki SELECT... INTO deyimi CTAS deyimi olarak. CTAS söz diziminde açıklanan DAĞITIM seçeneklerinden herhangi birini seçebilirsiniz. Bu örnekte ROUND_ROBIN dağıtım yöntemi kullanılır.
CREATE TABLE #tmp_fct
WITH
(
DISTRIBUTION = ROUND_ROBIN
)
AS
SELECT *
FROM [dbo].[FactInternetSales]
;
J. Birleştirme deyimlerini basitleştirmek için CTAS kullanma
Şunlar için geçerlidir: Azure Synapse Analytics ve Analytics Platform Sistemi (PDW)
Birleştirme deyimleri en azından kısmen kullanılarak CTAS
değiştirilebilir. ve UPDATE
öğesini INSERT
tek bir deyimde birleştirebilirsiniz. Silinen kayıtların ikinci bir deyimle kapatılması gerekir.
Bir örnek UPSERT
aşağıda verilmiştir:
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];
Kahraman. Çıktının veri türünü ve boş değer atanabilirliğini açıkça belirtin
Şunlar için geçerlidir: Azure Synapse Analytics ve Analytics Platform Sistemi (PDW)
SQL Server kodu Azure Synapse Analytics'e geçirirken bu tür bir kodlama düzeninde çalıştığınızı fark edebilirsiniz:
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
;
İçgüdüsel olarak bu kodu bir CTAS'ye geçirmeniz gerektiğini düşünebilirsiniz ve doğru olursunuz. Ancak burada gizli bir sorun var.
Aşağıdaki kod aynı sonucu VERMEZ:
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
;
"Result" sütununun ifadenin veri türünü ve null atanabilirlik değerlerini ilettiğine dikkat edin. Bu, dikkatli değilseniz değerlerde küçük farklılıklara yol açabilir.
Örnek olarak aşağıdakileri deneyin:
SELECT result,result*@d
from result
;
SELECT result,result*@d
from ctas_r
;
Sonuç için depolanan değer farklıdır. Sonuç sütunundaki kalıcı değer diğer ifadelerde kullanıldığından hata daha da önemli hale gelir.
Bu, veri geçişleri için önemlidir. İkinci sorgu muhtemelen daha doğru olsa da bir sorun vardır. Veriler kaynak sisteme kıyasla farklı olabilir ve bu da geçişte bütünlük sorularına yol açar. Bu, "yanlış" yanıtın aslında doğru olduğu nadir durumlardan biridir!
İki sonuç arasındaki bu eşitsizliği görme nedenimiz örtük tür atamasına kadar aşağıdadır. İlk örnekte, tablo sütun tanımını tanımlar. Satır eklendiğinde örtük tür dönüştürmesi gerçekleşir. İkinci örnekte, ifade sütunun veri türünü tanımladığı için örtük tür dönüştürmesi yoktur. İkinci örnekteki sütunun NULLable sütunu olarak tanımlandığına ancak ilk örnekte tanımlanmadığını da görebilirsiniz. Tablo ilk örnek sütunda oluşturulduğunda null atanabilirlik açıkça tanımlanmıştır. İkinci örnekte, ifadeye bırakılmıştı ve varsayılan olarak bu bir NULL
tanımla sonuçlanırdı.
Bu sorunları çözmek için, deyiminin bölümünde CTAS
tür dönüştürmesini ve null atanabilirliği SELECT
açıkça ayarlamanız gerekir. Tablo oluşturma bölümünde bu özellikleri ayarlayamazsınız.
Bu örnekte kodun nasıl düzeltileceğini gösterilmektedir:
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
Örnekte aşağıdakilere dikkat edin:
- CAST veya CONVERT kullanılmış olabilir.
- ISNULL, COALESCE değil NULLability'yi zorlamak için kullanılır.
- ISNULL en dıştaki işlevdir.
- ISNULL'ın ikinci bölümü sabittir.
0
Not
Null atanabilirliğin doğru ayarlanması için değil kullanılması ISNULL
COALESCE
çok önemlidir. COALESCE
belirlenici bir işlev olmadığından ifadenin sonucu her zaman NULLable olur. ISNULL
farklıdır. Belirleyicidir. Bu nedenle, işlevin ikinci bölümü ISNULL
sabit veya değişmez değer olduğunda sonuçta elde edilen değer NULL DEĞİl olur.
Bu ipucu yalnızca hesaplamalarınızın bütünlüğünü sağlamak için kullanışlı değildir. Tablo bölümü değiştirme için de önemlidir. Bu tablonun olgunuz olarak tanımlandığını düşünün:
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
)
)
)
;
Ancak değer alanı hesaplanmış bir ifadedir ve kaynak verilerin bir parçası değildir.
Bölümlenmiş veri kümenizi oluşturmak için aşağıdaki örneği göz önünde bulundurun:
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')
;
Sorgu mükemmel bir şekilde çalışır. Sorun, bölüm anahtarını gerçekleştirmeye çalıştığınızda ortaya çıkar. Tablo tanımları eşleşmiyor. Tablo tanımlarını oluşturmak için CTAS'nin değiştirilmesi gerektiğini eşleştirin.
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');
Bu nedenle, CTAS'de tür tutarlılığının ve null atanabilirlik özelliklerinin korunmasının iyi bir mühendislik en iyi uygulaması olduğunu görebilirsiniz. Hesaplamalarınızda bütünlüğü korumaya yardımcı olur ve bölüm değiştirmenin mümkün olmasını sağlar.
L. MAXDOP 1 ile sıralı kümelenmiş columnstore dizini oluşturma
CREATE TABLE Table1 WITH (DISTRIBUTION = HASH(c1), CLUSTERED COLUMNSTORE INDEX ORDER(c1) )
AS SELECT * FROM ExampleTable
OPTION (MAXDOP 1);
Sonraki adımlar
- CREATE EXTERNAL DATA SOURCE (Transact-SQL)
- CREATE EXTERNAL FILE FORMAT (Transact-SQL)
- CREATE EXTERNAL TABLE (Transact-SQL)
- CREATE EXTERNAL TABLE AS SELECT (Transact-SQL)
- CREATE TABLE (Azure Synapse Analytics)
- DROP TABLE (Transact-SQL)
- DROP EXTERNAL TABLE (Transact-SQL)
- ALTER TABLE (Transact-SQL)
- ALTER EXTERNAL TABLE (Transact-SQL)
Şunlar için geçerlidir:Microsoft Fabric'te Ambar
CREATE TABLE AS SELECT (CTAS), kullanılabilir en önemli T-SQL özelliklerinden biridir. Bu SELECT deyiminin çıkışı temelinde yeni tablo oluşturan, tümüyle paralelleştirilmiş bir işlemdir. CTAS, tablonun kopyasını oluşturmanın en basit ve en hızlı yoludur.
Örneğin, Aşağıdakileri yapmak için Microsoft Fabric'teki Ambar'da CTAS kullanın:
- Kaynak tablonun bazı sütunlarını içeren bir tablonun kopyasını oluşturun.
- Diğer tabloları birleştiren bir sorgunun sonucu olan bir tablo oluşturun.
Microsoft Fabric'teki Ambarınızda CTAS kullanma hakkında daha fazla bilgi için bkz. TSQL kullanarak verileri Ambarınıza alma.
Not
CTAS, tablo oluşturma özelliklerini eklediğinden, bu konu CREATE TABLE konusunu yinelememeye çalışır. Bunun yerine, CTAS ve CREATE TABLE deyimleri arasındaki farkları açıklar. CREATE TABLE ayrıntıları için bkz. CREATE TABLE deyimi.
Transact-SQL söz dizimi kuralları
Söz dizimi
CREATE TABLE { database_name.schema_name.table_name | schema_name.table_name | table_name }
AS <select_statement>
[;]
<select_statement> ::=
SELECT select_criteria
Bağımsız değişkenler
Ayrıntılar için bkz. Microsoft Fabric için CREATE TABLE'daki Bağımsız Değişkenler.
Sütun seçenekleri
column_name
[ ,...n
]
Sütun adları CREATE TABLE'da belirtilen sütun seçeneklerine izin vermez. Bunun yerine, yeni tablo için bir veya daha fazla sütun adının isteğe bağlı bir listesini sağlayabilirsiniz. Yeni tablodaki sütunlar belirttiğiniz adları kullanır. Sütun adlarını belirttiğinizde, sütun listesindeki sütun sayısı seçme sonuçlarındaki sütun sayısıyla eşleşmelidir. Herhangi bir sütun adı belirtmezseniz, yeni hedef tablo select deyimi sonuçlarında sütun adlarını kullanır.
Veri türleri, harmanlama veya null atanabilirlik gibi diğer sütun seçeneklerini belirtemezsiniz. Bu özniteliklerin her biri deyiminin sonuçlarından SELECT
türetilir. Ancak, öznitelikleri değiştirmek için SELECT deyimini kullanabilirsiniz.
SELECT deyimi
SELECT deyimi, CTAS ile CREATE TABLE arasındaki temel farktır.
SELECT
select_criteria
Yeni tabloyu select deyiminin sonuçlarıyla doldurur. select_criteria , yeni tabloya kopyalanacak verileri belirleyen SELECT deyiminin gövdesidir. SELECT deyimleri hakkında bilgi için bkz. SELECT (Transact-SQL).
İzinler
CTAS, SELECT
select_criteria başvuruda bulunan nesneler üzerinde izin gerektirir.
Tablo oluşturma izinleri için bkz. CREATE TABLE'da İzinler .
Açıklamalar
Ayrıntılar için bkz. CREATE TABLE'daki Genel Açıklamalar .
Sınırlamalar ve kısıtlamalar
SET ROWCOUNT (Transact-SQL) CTAS üzerinde hiçbir etkiye sahip değildir. Benzer bir davranış elde etmek için TOP (Transact-SQL) kullanın.
Ayrıntılar için bkz. CREATE TABLE'daki Sınırlamalar ve Kısıtlamalar .
Kilitleme davranışı
Ayrıntılar için bkz. CREATE TABLE'da Kilitleme Davranışı .
Tablo kopyalama örnekleri
Microsoft Fabric'teki Ambarınızda CTAS kullanma hakkında daha fazla bilgi için bkz. TSQL kullanarak verileri Ambarınıza alma.
A. Sütun özniteliklerini değiştirmek için CTAS kullanma
Bu örnekte, tablodaki DimCustomer2
birkaç sütun için veri türlerini ve null atanabilirliği değiştirmek için CTAS kullanılır.
-- 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. Daha az sütun içeren bir tablo oluşturmak için CTAS kullanma
Aşağıdaki örnek adlı myTable (c, ln)
bir tablo oluşturur. Yeni tabloda yalnızca iki sütun vardır. Sütunların adları için SELECT deyimindeki sütun diğer adlarını kullanır.
CREATE TABLE myTable
AS SELECT CustomerKey AS c, LastName AS ln
FROM dimCustomer;
C. SELECT yerine CTAS kullanın.. INTO
SQL Server kodu normalde SELECT kullanır.. BIR tabloyu SELECT deyiminin sonuçlarıyla doldurmak için INTO. Bu, SQL Server SELECT.. INTO deyimi.
SELECT *
INTO NewFactTable
FROM [dbo].[FactInternetSales]
Bu örnekte, önceki SELECT... INTO deyimi CTAS deyimi olarak.
CREATE TABLE NewFactTable
AS
SELECT *
FROM [dbo].[FactInternetSales]
;
D. Birleştirme deyimlerini basitleştirmek için CTAS kullanma
Birleştirme deyimleri en azından kısmen kullanılarak CTAS
değiştirilebilir. ve UPDATE
öğesini INSERT
tek bir deyimde birleştirebilirsiniz. Silinen kayıtların ikinci bir deyimle kapatılması gerekir.
Bir örnek UPSERT
aşağıda verilmiştir:
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]
)
;
E. Çıktının veri türünü ve boş değer atanabilirliğini açıkça belirtin
SQL Server kodu Ambar'a geçirirken, bu tür bir kodlama düzeninde çalıştırdığınızı fark edebilirsiniz:
DECLARE @d DECIMAL(7,2) = 85.455
, @f FLOAT(24) = 85.455
CREATE TABLE result (result DECIMAL(7,2) NOT NULL)
INSERT INTO result
SELECT @d*@f
;
İçgüdüsel olarak bu kodu bir CTAS'ye geçirmeniz gerektiğini düşünebilirsiniz ve doğru olursunuz. Ancak burada gizli bir sorun var.
Aşağıdaki kod aynı sonucu VERMEZ:
DECLARE @d DECIMAL(7,2) = 85.455
, @f FLOAT(24) = 85.455
;
CREATE TABLE ctas_r
AS
SELECT @d*@f as result
;
"Result" sütununun ifadenin veri türünü ve null atanabilirlik değerlerini ilettiğine dikkat edin. Bu, dikkatli değilseniz değerlerde küçük farklılıklara yol açabilir.
Örnek olarak aşağıdakileri deneyin:
SELECT result,result*@d
from result
;
SELECT result,result*@d
from ctas_r
;
Sonuç için depolanan değer farklıdır. Sonuç sütunundaki kalıcı değer diğer ifadelerde kullanıldığından hata daha da önemli hale gelir.
Bu, veri geçişleri için önemlidir. İkinci sorgu muhtemelen daha doğru olsa da bir sorun vardır. Veriler kaynak sisteme kıyasla farklı olabilir ve bu da geçişte bütünlük sorularına yol açar. Bu, "yanlış" yanıtın aslında doğru olduğu nadir durumlardan biridir!
İki sonuç arasındaki bu eşitsizliği görme nedenimiz örtük tür atamasına kadar aşağıdadır. İlk örnekte, tablo sütun tanımını tanımlar. Satır eklendiğinde örtük tür dönüştürmesi gerçekleşir. İkinci örnekte, ifade sütunun veri türünü tanımladığı için örtük tür dönüştürmesi yoktur. İkinci örnekteki sütunun NULLable sütunu olarak tanımlandığına ancak ilk örnekte tanımlanmadığını da görebilirsiniz. Tablo ilk örnek sütunda oluşturulduğunda null atanabilirlik açıkça tanımlanmıştır. İkinci örnekte, ifadeye bırakılmıştı ve varsayılan olarak bu bir NULL
tanımla sonuçlanırdı.
Bu sorunları çözmek için, deyiminin bölümünde CTAS
tür dönüştürmesini ve null atanabilirliği SELECT
açıkça ayarlamanız gerekir. Tablo oluşturma bölümünde bu özellikleri ayarlayamazsınız.
Bu örnekte kodun nasıl düzeltileceğini gösterilmektedir:
DECLARE @d DECIMAL(7,2) = 85.455
, @f FLOAT(24) = 85.455
CREATE TABLE ctas_r
AS
SELECT ISNULL(CAST(@d*@f AS DECIMAL(7,2)),0) as result
Örnekte aşağıdakilere dikkat edin:
- CAST veya CONVERT kullanılmış olabilir.
- ISNULL, COALESCE değil NULLability'yi zorlamak için kullanılır.
- ISNULL en dıştaki işlevdir.
- ISNULL'ın ikinci bölümü sabittir.
0
Not
Null atanabilirliğin doğru ayarlanması için değil kullanılması ISNULL
COALESCE
çok önemlidir. COALESCE
belirlenici bir işlev olmadığından ifadenin sonucu her zaman NULLable olur. ISNULL
farklıdır. Belirleyicidir. Bu nedenle, işlevin ikinci bölümü ISNULL
sabit veya değişmez değer olduğunda sonuçta elde edilen değer NULL DEĞİl olur.
Bu ipucu yalnızca hesaplamalarınızın bütünlüğünü sağlamak için kullanışlı değildir. Tablo bölümü değiştirme için de önemlidir. Bu tablonun olgunuz olarak tanımlandığını düşünün:
CREATE TABLE [dbo].[Sales]
(
[date] INT NOT NULL
, [product] INT NOT NULL
, [store] INT NOT NULL
, [quantity] INT NOT NULL
, [price] DECIMAL(7,2) NOT NULL
, [amount] DECIMAL(7,2) NOT NULL
)
;
Ancak değer alanı hesaplanmış bir ifadedir ve kaynak verilerin bir parçası değildir.
Bu nedenle, CTAS'de tür tutarlılığının ve null atanabilirlik özelliklerinin korunmasının iyi bir mühendislik en iyi uygulaması olduğunu görebilirsiniz. Hesaplamalarınızda bütünlüğü korumaya yardımcı olur.