Aracılığıyla paylaş


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.

WITHcommon_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).

SELECTselect_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, SELECTselect_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_ROBINvarsayalı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 ProductKeydağı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 CTASdeğ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.

CREATE TABLE AS SELECT sonuçlarının SQL Server Management Studio (SSMS) ekran görüntüsü.

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ı ISNULLCOALESCEç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

Ş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.

SELECTselect_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, SELECTselect_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 CTASdeğ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.

CREATE TABLE AS SELECT sonuçlarının SQL Server Management Studio (SSMS) ekran görüntüsü.

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ı ISNULLCOALESCEç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.

Sonraki adımlar