Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
CREATE TABLE AS SELECT (CTAS), mevcut en önemli T-SQL özelliklerinden biridir. Bu, SELECT ifadesinin çıktısına dayalı olarak yeni bir tablo oluşturan tamamen paralel bir işlemdir. CTAS, bir tablonun kopyasını oluşturmanın en basit ve hızlı yoludur.
Örneğin, CTAS kullanılarak aşağıdaki işlemler yapılabilir:
- Farklı bir hash dağılımı sütunuyla bir tablo yeniden oluşturun.
- Bir tabloyu çoğaltılmış şekilde yeniden oluşturun.
- Tablodaki bazı sütunlarda bir columnstore indeksi oluşturun.
- Harici verileri sorgulayın veya içe aktarın.
Uyarı
CREATE TABLE AS SELECT (CTAS) tablo oluşturma yeteneklerini artırdığı için, bu konu konuyu CREATE TABLE tekrarlamamaya çalışır. Bunun yerine, CTAS ile CREATE TABLE arasındaki farkları açıklar.
- CTAS Microsoft Fabric'teki Warehouse'da desteklenmektedir. CREATE TABLE AS SELECT makalesinin Fabric versiyonunu görüntüleyin.
- Bu söz dizimi, Azure Synapse Analytics'teki sunucusuz SQL havuzu tarafından desteklenmez.
-
CREATE TABLE AS SELECT(CTAS) Microsoft Fabric'teki Depoda desteklenmektedir. Daha fazla bilgi için bu makalenin Fabric Data Warehouse versiyonuna bakınız.
Transact-SQL söz dizimi kuralları
Sözdizimi
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
Daha fazla bilgi için, argümanlar bölümündeCREATE TABLEbkz.
Sütun Seçenekleri
column_name [ ,...n ]
Sütun adları, içinde bahsedilen CREATE TABLE 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çim sonuçlarındaki sütun sayısıyla eşleşmelidir. Herhangi bir sütun adı belirtmezseniz, yeni hedef tablo select deyimi sonuçlarındaki sütun adlarını kullanır.
Veri türleri, harmanlama veya null atanabilirlik gibi diğer sütun seçeneklerini belirtemezsiniz. Bu özelliklerin her biri ifadenin SELECT sonuçlarından türetilmiştir. Ancak, öznitelikleri değiştirmek için SELECT deyimini kullanabilirsiniz. Örneğin, bkz. Sütun özniteliklerini değiştirmek için CTAS kullanın.
Tablo dağılım seçenekleri
Detaylar ve en iyi dağıtım sütununun nasıl seçileceğini anlamak için Tablo dağıtım seçenekleri bölümüne bakınız CREATE TABLE. Gerçek kullanım veya örnek sorgulara dayalı olarak bir tablo için hangi dağıtımı seçeceğinize dair öneriler için Azure Synapse SQL'deki Distribution Advisor'a bakınız.
DISTRIBUTION
=
HASH (distribution_column_name) | ROUND_ROBIN | ÇOĞALTMAK
CTAS ifadesi dağıtım seçeneği gerektirir ve varsayılan değerleri yoktur. Bu, varsayılan ayarlara sahip CREATE TABLE'dan farklıdır.
DISTRIBUTION = HASH ( [distribution_column_name [, ...n]] )
Sekiz sütuna kadar hash değerlerine göre satırlar dağıtılır, böylece temel tablo verilerinin daha eşit dağılımı sağlanır, zaman içinde veri çarpıklığını azaltır ve sorgu performansını artırır.
Uyarı
- Özelliği etkinleştirmek için, bu komutla veritabanının uyumluluk seviyesini 50'ye değiştirin. Veritabanı uyumluluk seviyesinin ayarlanması hakkında daha fazla bilgi için bkz. ALTER DATABASE SCOPED CONFIGURATION'A BAKıNıZ. Örneğin:
ALTER DATABASE SCOPED CONFIGURATION SET DW_COMPATIBILITY_LEVEL = 50; - Çok sütunlu dağıtım (MCD) özelliğini devre dışı bırakmak için, veritabanının uyumluluk seviyesini AUTO olarak değiştirmek için bu komutu çalıştırın. Örneğin:
ALTER DATABASE SCOPED CONFIGURATION SET DW_COMPATIBILITY_LEVEL = AUTO;Mevcut MCD tabloları kalacak ama okunmaz hale geliyor. MCD tabloları üzerinden yapılan sorgular şu hatayı döndürecektir: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 sağlamak için özelliği tekrar etkinleştirin.
- Veriyi bir MCD tablosuna yüklemek için CTAS ifadesi kullanın ve veri kaynağı Synapse SQL tabloları olmalıdır.
- MCD HEAP hedef tablolarında CTAS desteklenmez. Bunun yerine, verileri MCD HEAP tablolarına yüklemek için INSERT SELECT yöntemini bir çözüm olarak kullanın.
- MCD tabloları oluşturmak için SSMS kullanmak , şu anda SSMS sürüm 19'dan sonra desteklenmektedir.
Detaylar ve en iyi dağıtım sütununun nasıl seçileceğini anlamak için Tablo dağıtım seçenekleri bölümüne bakınız CREATE TABLE.
İş yükünüze göre en iyi dağıtım önerileri için Synapse SQL Dağıtım Danışmanı (Önizleme) sayfasına bakınız.
Tablo bölme seçenekleri
CTAS ifadesi, kaynak tablo bölümlenmiş olsa bile varsayılan olarak bölünmemiş bir tablo oluşturur. CTAS ifadesiyle bölümlenmiş bir tablo oluşturmak için bölümleme seçeneğini belirtmeniz gerekir.
Detaylar için, 'deki CREATE TABLE bölümüne bakınız.
SELECT ifadesi
SELECT ifadesi, 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 kontrol etmek için MAXDOP'u tam sayı değerine ayarlayabilirler. MAXDOP 1 olarak ayarlandığında, sorgu tek bir iş parçacığı tarafından yürütülür.
Permissions
CTAS, SELECT referans verilen herhangi bir nesne için izin gerektirir.
Bir tablo oluşturma izinleri için, Permissions içindeki CREATE TABLEizinlere bakınız.
Açıklamalar
Detaylar için bkz. Genel Açıklamalar.CREATE TABLE
Sınırlamalar ve kısıtlamalar
Sınırlamalar ve kısıtlamalar hakkında daha fazla bilgi için, Sınırlamalar ve Kısıtlamalar bölümünde CREATE TABLEbkz.
Azure Synapse Analytics'te desteklenen herhangi bir veri tipindeki sütunlarda sıralı kümelenmiş columnstore index oluşturulabilir, sadece string sütunları hariç.
SET SIRA SAYISI (Transact-SQL) CTAS üzerinde hiçbir etkisi yoktur. Benzer bir davranış elde etmek için TOP (Transact-SQL) kullanın.
CTAS bu
OPENJSONfonksiyonu ifadeninSELECTbir parçası olarak desteklemez. Bunun yerineINSERT INTO ... SELECT. Örneğin: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 );
Kilitleme davranışı
Detaylar için , Davranışı Kilitleme (Davranışı kilitleme ) CREATE TABLEbölümünü inceleyin.
Performance
Hash-dağıtılmış bir tablo için, CTAS kullanarak farklı bir dağıtım sütunu seçebilirsiniz ve böylece birleştirmeler ve toplamalar için daha iyi performans elde edebilirsiniz. Farklı bir dağıtım sütunu seçmek hedefiniz değilse, aynı dağıtım sütununu belirtirseniz en iyi CTAS performansına sahip olursunuz çünkü bu satırların yeniden dağıtılmasını engeller.
Tablo oluşturmak için CTAS kullanıyorsanız ve performans faktör değilse, dağıtım sütunu seçmek zorunda kalmamak için belirtebilirsiniz ROUND_ROBIN .
Sonraki sorgularda veri hareketini önlemek için, her Compute düğümünde tablonun tam bir kopyasını yüklemek için artan depolama maliyeti ile belirtebilirsiniz REPLICATE .
Bir tablo kopyalamak için örnekler
A. Bir tabloyu kopyalamak için CTAS kullanın
Apply to: Azure Synapse Analytics and Analytics Platform System (PDW)
Belki de en CTAS yaygın kullanımlarından biri, DDL'yi değiştirebilmek için bir tablo kopyası oluşturmaktır. Örneğin, tabloyu başlangıçta olarak ROUND_ROBIN oluşturduysanız ve şimdi bir sütunda dağıtılan bir tabloya dönüştürmek istiyorsanız, CTAS dağıtım sütununu böyle değiştirirsiniz.
CTAS ayrıca bölümleme, indeksleme veya sütun türlerini değiştirmek için de kullanılabilir.
Diyelim ki bu tabloyu varsayılan HEAP dağıtım türünü belirtip kullanarak ROUND_ROBINoluşturdunuz.
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 faydalanabilmek için kümelenmiş columnstore indeksiyle bu tablonun yeni bir kopyasını oluşturmak istersiniz. Ayrıca bu tabloyu ProductKey da dağıtmak istersiniz çünkü bu sütunda birleştirmeleri öngörüyorsunuz ve birleştirmeler sırasında ProductKeyveri hareketini önlemek istiyorsunuz. Son olarak, eski bölümleri bırakarak eski verileri hızlıca silmek için bölümleme OrderDateKey eklemek istersiniz. İşte eski tablonuzu yeni bir tabloya kopyalayacak CTAS ifadesi:
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 tablonuzla değiştirip eski tablolarınızı bırakabilirsiniz.
RENAME OBJECT FactInternetSales TO FactInternetSales_old;
RENAME OBJECT FactInternetSales_new TO FactInternetSales;
DROP TABLE FactInternetSales_old;
Sütun seçenekleri örnekleri
B. Sütun özelliklerini değiştirmek için CTAS kullanın
Apply to: Azure Synapse Analytics and Analytics Platform System (PDW)
Bu örnek, tablodaki DimCustomer2 birkaç sütun için veri türlerini, nullability'yi ve derlemesini değiştirmek için CTAS kullanı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 bir adım olarak, tablo isimlerini değiştirmek için RENAME (Transact-SQL) kullanarak değiştirebilirsiniz. Bu da DimCustomer2'yi yeni masa yapıyor.
RENAME OBJECT DimCustomer2 TO DimCustomer2_old;
RENAME OBJECT test TO DimCustomer2;
DROP TABLE DimCustomer2_old;
Tablo dağılımı örnekleri
C. Bir tablo için dağıtım yöntemini değiştirmek için CTAS kullanın
Apply to: Azure Synapse Analytics and Analytics Platform System (PDW)
Bu basit örnek, bir tablo için dağıtım yönteminin nasıl değiştirileceğini gösterir. Bunun nasıl yapılacağını göstermek için, hash-distributed tablosunu round-robin (round-robin) olarak değiştirir ve ardından round-robin tablosunu tekrar hash dağıtımlı olarak değiştirir. Final masası orijinal tabloyla eşleşir.
Çoğu durumda, hash-distributed tablosunu round-robin tablosuna çevirmenize gerek yoktur. Daha sık olarak, round-robin tablosunu hash dağıtılmış tabloya çevirmeniz gerekebilir. Örneğin, başlangıçta yeni bir tabloyu round-robin olarak yükleyip daha sonra daha iyi katılım performansı için hash-distributed tabloya taşıyabilirsiniz.
Bu örnek AdventureWorksDW örnek veritabanını kullanır. Azure Synapse Analytics sürümünü yüklemek için bkz. Quickstart: Create and query a dedicated SQL pool (eski adıyla SQL DW) in Azure Synapse Analytics in Azure portal.
-- 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];
Sonra, tekrar hash dağıtılmış bir tabloya dönüştürün.
-- 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. Bir tabloyu çoğaltılmış bir tabloya dönüştürmek için CTAS kullanın
Apply to: Azure Synapse Analytics and Analytics Platform System (PDW)
Bu örnek, round-robin veya hash-dağıtılmış tabloları çoğaltılmış bir tabloya dönüştürmek için geçerlidir. Bu özel örnek, dağılım türünün değiştirilmesinin önceki yöntemini bir adım daha ileri götürüyor.
DimSalesTerritory Boyut olduğu ve muhtemelen daha küçük bir tablo olduğundan, diğer tablolara katılırken veri hareketini önlemek için tabloyu çoğaltılmış şekilde 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. CTAS kullanarak daha az sütunlu bir tablo oluşturun
Apply to: Azure Synapse Analytics and Analytics Platform System (PDW)
Aşağıdaki örnek, ' myTable (c, ln)adlı bir round-robin dağıtılmış tablo oluşturur. Yeni tabloda sadece iki sütun var. Sütun isimleri için SELECT ifadesindeki sütun takma adı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ı örnekleri
F. CREATE TABLE AS SELECT (CTAS) ile bir Sorgu İpucu kullanın
Apply to: Azure Synapse Analytics and Analytics Platform System (PDW)
Bu sorgu, CTAS ifadesiyle sorgu birleştirme ipucu kullanmanın temel sözdizimi gösterilir. Sorgu gönderildikten sonra, Azure Synapse Analytics her dağıtım için sorgu planını oluştururken hash birleştirme stratejisini uygular. Hash birleştirme sorgu ipucu hakkında daha fazla bilgi için OPTION Maddesi (Transact-SQL) bölümüne bakınız.
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 );
Hardış tablolar için örnekler
G. Use CTAS to import data from Azure Blob storage
Apply to: Azure Synapse Analytics and Analytics Platform System (PDW)
Verileri harici bir tablodan aktarmak için, harici tablodan seçmek için CREATE TABLE AS SELECT tuşunu kullanın. Dış bir tablodan Azure Synapse Analytics'e veri seçme sözdizimi, normal bir tablodan veri seçme sentaksisiyle aynıdır.
Aşağıdaki örnek, Azure Blob Depolama hesabındaki veriler için harici bir tablo tanımlar. Daha sonra harici tablodan seçmek için CREATE TABLE AS SELECT tuşunu kullanır. Bu, Azure Blob Storage metin-delimited dosyalarından verileri içe aktarır ve verileri yeni bir Azure Synapse Analytics tablosuna saklar.
--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. Hadoop verilerini harici bir tablodan aktarmak için CTAS kullanın
Geçerlidir: Analytics Platform System (PDW)
Verileri harici bir tablodan aktarmak için, harici tablodan seçmek için CREATE TABLE AS SELECT tuşunu kullanın. Verileri harici bir tablodan Analytics Platform System'e (PDW) seçme sözdizimi, normal bir tablodan veri seçme sözdizimi ile aynıdır.
Aşağıdaki örnek, bir Hadoop kümesi üzerinde harici bir tablo tanımlar. Daha sonra harici tablodan seçmek için CREATE TABLE AS SELECT tuşunu kullanır. Bu, Hadoop metinle belirlenmiş dosyalarından verileri içe aktarır ve verileri yeni bir Analitik Platform Sistemi (PDW) tablosuna saklar.
-- 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 kodunun yerine CTAS kullanımı örnekleri
Bazı desteklenmeyen özellikleri aşmak için CTAS kullanın. Kodunuzu veri deposunda çalıştırabilmenin yanı sıra, mevcut kodu CTAS ile yeniden yazmak genellikle performansı artırır. Bu, tamamen paralel tasarımının bir sonucudur.
Uyarı
"Önce CTAS" diye düşünmeye çalış. Bir problemi kullanarak CTAS çözebileceğinizi düşünüyorsanız, genellikle bu en iyi yaklaşımdır - sonuç olarak daha fazla veri yazıyor olsanız bile.
I. SELECT yerine CTAS kullanın.. İÇİNE
Apply to: Azure Synapse Analytics and Analytics Platform System (PDW)
SQL Server kodu genellikle SELECT.. kullanır. INTO ile bir tabloyu SELECT ifadesinin sonuçlarıyla doldurur. Bu, SQL Server SELECT'e bir örnektir.. İÇ VER.
SELECT *
INTO #tmp_fct
FROM [dbo].[FactInternetSales]
Bu sözdizimi Azure Synapse Analytics ve Parallel Data Warehouse'da desteklenmemektedir. Bu örnek, önceki SELECT.. INTO bir CTAS beyanı olarak beyan. CTAS sözdiziminde tanımlanan DISTRIBUTION 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 ifadelerini basitleştirmek için CTAS kullanın
Apply to: Azure Synapse Analytics and Analytics Platform System (PDW)
Merge ifadeleri, en azından kısmen kullanılarak CTASdeğiştirilebilir. Ve INSERT 'ni UPDATE tek bir ifadede birleştirebilirsiniz. Silinen kayıtlar ikinci bir açıklamada kapatılmalıdır.
Bir UPSERT örnek şöyledir:
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. Veri tipini ve çıktının nullability durumunu açıkça belirtin
Apply to: Azure Synapse Analytics and Analytics Platform System (PDW)
SQL Server kodunu Azure Synapse Analytics'e taşırken, şu tür bir kodlama deseniyle karşılaşabilirsiniz:
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'a aktarmanız gerektiğini düşünebilirsiniz ve haklı 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
;
"Sonuç" sütununun ifadenin veri tipi ve nullability değerlerini ileri taşıdığını fark edin. Bu, dikkatli olmazsanız değerlerde ince farklılıklara yol açabilir.
Aşağıyı örnek olarak deneyin:
SELECT result,result*@d
from result
;
SELECT result,result*@d
from ctas_r
;
Sonuç için saklanan değer farklıdır. Sonuç sütunundaki kalıcı değer diğer ifadelerde kullanıldıkça hata daha da anlamlı hale gelir.
Bu, veri taşınması için önemlidir. İkinci sorgu tartışmasız daha doğru olsa da bir sorun var. Veriler, kaynak sistemden farklı olur ve bu da göçte bütünlük sorularına yol açar. Bu, "yanlış" cevabın aslında doğru olduğu nadir durumlardan biridir!
İki sonuç arasındaki bu farkı görmemizin sebebi örtük tip oyunculuğudur. İlk örnekte, tablo sütun tanımını tanımlar. Satır eklendiğinde örtük bir tür dönüşümü gerçekleşir. İkinci örnekte, ifade sütunun veri tipini tanımladığı için örtük tip dönüşümü yoktur. Ayrıca, ikinci örnekteki sütunun NULL bir sütun olarak tanımlandığına dikkat edin; oysa birinci örnekte tanımlanmamış. Tablo ilk örnek sütunda oluşturulduğunda nullability açıkça tanımlanmıştır. İkinci örnekte, bu ifade ifadeye bırakılmıştı ve varsayılan olarak bu bir NULL tanım ortaya çıkardı.
Bu sorunları çözmek için, ifadenin SELECT bölümünde tür dönüşümü ve nullability'yi CTAS açıkça ayarlamanız gerekir. Bu özellikleri oluştur tablo bölümünde ayarlayamazsınız.
Bu örnek, kodun nasıl düzeltileceğini gösterir:
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
Aşağıdaki örnekte dikkat edin:
- CAST veya CONVERT kullanılabilirdi.
- ISNULL, NULLability'yi zorunlu kılmak için kullanılır, KOBİLSİK değil.
- ISNULL en dıştaki işlevdir.
- ISNULL'un ikinci kısmı bir sabittir,
0.
Uyarı
Nullability'nin doğru ayarlanması için onu kullanmak ISNULL hayati önemde, değil COALESCE.
COALESCE deterministik bir fonksiyon değildir ve bu nedenle ifadenin sonucu her zaman NULLable olacaktır.
ISNULL farklıdır. Bu deterministiktir. Bu nedenle, fonksiyonun ISNULL ikinci kısmı sabit veya literal olduğunda, ortaya çıkan değer NULL OLMAZ.
Bu ipucu sadece hesaplamalarınızın bütünlüğünü sağlamak için faydalı değildir. Ayrıca tablo bölüm anahtarlamasında da önemlidir. Bir tabloyu kendi gerçeğiniz olarak tanımladığınızı hayal edin:
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 verinin parçası değildir.
Bölümlenmiş veri setinizi oluşturmak için aşağıdaki örneği düşünün:
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 sorunsuz çalışıyordu. Sorun, bölüm anahtarını yapmaya çalıştığınızda ortaya çıkıyor. Tablo tanımları uyuşmuyor. Tablo tanımlarını oluşturmak için CTAS'ın değiştirilmesi gerekir.
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, tip tutarlılığı ve bir CTAS'ta nullability özelliklerini korumanın iyi bir mühendislik en iyi uygulaması olduğunu görebilirsiniz. Bu, hesaplamalarınızda bütünlüğü korumaya yardımcı olur ve ayrıca bölüm değiştirmenin mümkün olmasını sağlar.
L. MAXDOP 1 ile sıralı kümelenmiş bir sütun deposu indeksi oluşturun
CREATE TABLE Table1 WITH (DISTRIBUTION = HASH(c1), CLUSTERED COLUMNSTORE INDEX ORDER(c1) )
AS SELECT * FROM ExampleTable
OPTION (MAXDOP 1);
İlgili içerik
- HARICI VERI KAYNAĞI OLUŞTUR (Transact-SQL)
- HARICI DOSYA FORMATI OLUŞTUR (Transact-SQL)
- DIŞ TABLO OLUŞTUR (Transact-SQL)
- HARICI TABLO OLARAK SELECT (Transact-SQL) OLUŞTUR
- CREATE TABLE (Azure Synapse Analytics)
- DROP TABLE (Transact-SQL)
- HARICI TABLOYU BIRAKMA (Transact-SQL)
- ALTER TABLE (Transact-SQL)
- HARICI TABLOYU DEĞIŞTIR (Transact-SQL)
CREATE TABLE AS SELECT (CTAS), mevcut en önemli T-SQL özelliklerinden biridir. Bu, SELECT ifadesinin çıktısına dayalı olarak yeni bir tablo oluşturan tamamen paralel bir işlemdir. CTAS, bir tablonun kopyasını oluşturmanın en basit ve hızlı yoludur.
Örneğin, Microsoft Fabric'te Warehouse'da CTAS kullanabilirsiniz:
- Kaynak tablonun bazı sütunlarıyla bir tablo kopyası oluşturun.
- Diğer tablolara katılan bir sorgu sonucu bir tablo oluşturun.
Microsoft Fabric'te Depoda CTAS kullanımı hakkında daha fazla bilgi için Transact-SQL kullanarak Verileri Depoya Aktarma bölümüne bakabilirsiniz.
Uyarı
(CTAS) tablo oluşturma yeteneklerini artırdığı CREATE TABLE AS SELECT için, bu konu TABLO OLUŞTUR konusunu tekrarlamamaya çalışır. Bunun yerine, CTAS ile CREATE TABLE arasındaki farkları açıklar.
Transact-SQL söz dizimi kuralları
Sözdizimi
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
Yaygın argümanlar hakkında detaylar için Microsoft Fabric için CREATE TABLE içindeki Argümanlara bakınız.
ILE ([ ,... n])
Fabric Data Warehouse'daki veri kümeleme maddesi, CLUSTER BY veri kümeleme için en az bir sütunun ve en fazla dört sütunun belirtilmesini gerektirir.
Daha fazla bilgi için, Fabric Data Warehouse'da Veri kümeleme bölümünü inceleyebilirsiniz.
SELECT ifadesi
Bu SELECT ifade CTAS ile CREATE TABLEarasındaki temel farktır.
SELECT select_criteria
Yeni tabloyu bir SELECT ifadenin sonuçlarıyla doldurur.
select_criteria , yeni tabloya hangi verinin kopyalanacağını belirleyen SELECT ifadenin gövdesidir. Ifadeler hakkında SELECT bilgi için bkz. SELECT (Transact-SQL).
Uyarı
Microsoft Fabric'te CTAS'ta değişkenlerin kullanılmasına izin verilmez.
Permissions
CTAS, SELECT referans verilen herhangi bir nesne için izin gerektirir.
Bir tablo oluşturma izinleri için, Permissions içindeki CREATE TABLEizinlere bakınız.
Açıklamalar
Detaylar için bkz. Genel Açıklamalar.CREATE TABLE
Sınırlamalar ve kısıtlamalar
SET SIRA SAYISI (Transact-SQL) CTAS üzerinde hiçbir etkisi yoktur. Benzer bir davranış elde etmek için TOP (Transact-SQL) kullanın.
Detaylar için, Sınırlamalar ve Kısıtlamalar bölümünde CREATE TABLEbkz.
Kilitleme davranışı
Detaylar için , Davranışı Kilitleme (Davranışı kilitleme ) CREATE TABLEbölümünü inceleyin.
Bir tablo kopyalamak için örnekler
Microsoft Fabric'te Depoda CTAS kullanımı hakkında daha fazla bilgi için Transact-SQL kullanarak Verileri Depoya Aktarma bölümüne bakabilirsiniz.
A. Sütun özelliklerini değiştirmek için CTAS kullanın
Bu örnek, tablodaki birkaç sütun için veri türlerini ve nullability'yi değiştirmek için DimCustomer2 CTAS kullanı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. CTAS kullanarak daha az sütunlu bir tablo oluşturun
Aşağıdaki örnek, . myTable (c, ln)adlı bir tablo oluşturur. Yeni tabloda sadece iki sütun var. Sütun isimleri için SELECT ifadesindeki sütun takma adını kullanır.
CREATE TABLE myTable
AS SELECT CustomerKey AS c, LastName AS ln
FROM dimCustomer;
C. SELECT yerine CTAS kullanın.. İÇİNE
SQL Server kodu genellikle SELECT.. kullanır. INTO ile bir tabloyu SELECT ifadesinin sonuçlarıyla doldurur. Bu, SQL Server SELECT'e bir örnektir.. İÇ VER.
SELECT *
INTO NewFactTable
FROM [dbo].[FactInternetSales]
Bu örnek, önceki SELECT.. INTO bir CTAS beyanı olarak beyan.
CREATE TABLE NewFactTable
AS
SELECT *
FROM [dbo].[FactInternetSales]
;
D. Birleştirme ifadelerini basitleştirmek için CTAS kullanın
Merge ifadeleri, en azından kısmen kullanılarak CTASdeğiştirilebilir. Ve INSERT 'ni UPDATE tek bir ifadede birleştirebilirsiniz. Silinen kayıtlar ikinci bir açıklamada kapatılmalıdır.
Bir UPSERT örnek şöyledir:
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. Veri kümeleme ile bir tablo oluşturun
Aşağıdaki komutu kullanarak (CTAS) kullanarak yeni bir tablo CREATE TABLE AS SELECT oluşturun ve belirtilmiş bir veri küme sütunu oluşturuldu:
CREATE TABLE nyctlc_With_DataClustering
WITH (CLUSTER BY (lpepPickupDatetime))
AS SELECT * FROM nyctlc;
Daha fazla bilgi için, Fabric Data Warehouse'da Veri kümeleme bölümünü inceleyebilirsiniz.