Azure Synapse Analytics'te ayrılmış SQL havuzunu kullanarak vekil anahtarlar oluşturmak için IDENTITY kullanma
Bu makalede, ayrılmış SQL havuzundaki tablolarda vekil anahtarlar oluşturmak için IDENTITY özelliğini kullanmaya yönelik öneriler ve örnekler bulacaksınız.
Vekil anahtar nedir?
Tablodaki vekil anahtar, her satır için benzersiz tanımlayıcıya sahip bir sütundur. Anahtar tablo verilerinden oluşturulmaz. Veri modelleyicileri, veri ambarı modellerini tasarlarken tablolarında vekil anahtarlar oluşturmayı sever. Bu hedefe yük performansını etkilemeden basit ve etkili bir şekilde ulaşmak için IDENTITY özelliğini kullanabilirsiniz.
Not
Azure Synapse Analytics'te:
- Kimlik değeri her dağıtımda kendi başına artar ve diğer dağıtımlardaki KIMLIK değerleriyle çakışmaz. Kullanıcı açıkça "SET IDENTITY_INSERT ON" ile yinelenen bir değer eklerse veya IDENTITY'yi yeniden görüntülerse Synapse'teki IDENTITY değerinin benzersiz olacağı garanti edilmemektedir. Ayrıntılar için bkz. CREATE TABLE (Transact-SQL) IDENTITY (Özellik).
- Dağıtım sütununda UPDATE, IDENTITY değerinin benzersiz olmasını garanti etmez. Benzersizliği doğrulamak için dağıtım sütununda UPDATE sonrasında DBCC CHECKIDENT (Transact-SQL) kullanın.
IDENTITY sütunuyla tablo oluşturma
IDENTITY özelliği, yük performansını etkilemeden ayrılmış SQL havuzundaki tüm dağıtımların ölçeğini genişletecek şekilde tasarlanmıştır. Bu nedenle, KİmLİk uygulaması bu hedeflere ulaşma yönündedir.
Aşağıdaki deyime benzer bir söz dizimi kullanarak tabloyu ilk oluşturduğunuzda IDENTITY özelliğine sahip olarak tanımlayabilirsiniz:
CREATE TABLE dbo.T1
( C1 INT IDENTITY(1,1) NOT NULL
, C2 INT NULL
)
WITH
( DISTRIBUTION = HASH(C2)
, CLUSTERED COLUMNSTORE INDEX
)
;
Daha sonra tablosunu doldurmak için komutunu kullanabilirsiniz INSERT..SELECT
.
Bu bölümün geri kalanında, bunları daha iyi anlamanıza yardımcı olmak için uygulamanın nüansları vurgulanır.
Değerleri ayırma
IDENTITY özelliği, veri ambarının dağıtılmış mimarisi nedeniyle vekil değerlerin ayrılma sırasını garanti etmez. IDENTITY özelliği, yük performansını etkilemeden ayrılmış SQL havuzundaki tüm dağıtımların ölçeğini genişletecek şekilde tasarlanmıştır.
Aşağıdaki örnek bir çizimdir:
CREATE TABLE dbo.T1
( C1 INT IDENTITY(1,1) NOT NULL
, C2 VARCHAR(30) NULL
)
WITH
( DISTRIBUTION = HASH(C2)
, CLUSTERED COLUMNSTORE INDEX
)
;
INSERT INTO dbo.T1
VALUES (NULL);
INSERT INTO dbo.T1
VALUES (NULL);
SELECT *
FROM dbo.T1;
DBCC PDW_SHOWSPACEUSED('dbo.T1');
Önceki örnekte iki satır dağıtım 1'e indi. İlk satır, sütununda C1
1 vekil değerine, ikinci satır ise 61 vekil değerine sahiptir. Bu değerlerin her ikisi de IDENTITY özelliği tarafından oluşturuldu. Ancak, değerlerin ayrılması bitişik değildir. Bu davranış tasarım gereğidir.
Çarpık veriler
Veri türünün değer aralığı dağıtımlar arasında eşit olarak yayılır. Dağıtılan tabloda dengesiz dağıtılan veriler bulunuyorsa, veri türünün kullanılabilir değer aralığı zamanından önce tükenebilir. Örneğin, tüm veriler tek bir dağıtımda kalırsa, tablonun veri türü değerlerinin yalnızca altıda birine erişimi olur. Bu nedenle IDENTITY özelliği yalnızca ve BIGINT
veri türleriyle INT
sınırlıdır.
SEÇİN.. INTO
Mevcut bir IDENTITY sütunu yeni bir tabloya seçildiğinde, aşağıdaki koşullardan biri doğru olmadığı sürece yeni sütun IDENTITY özelliğini devralır:
- SELECT deyimi birleştirme içeriyor.
- Birden çok SELECT deyimi UNION kullanılarak birleştiriliyor.
- SELECT listesinde IDENTITY sütunu birden çok kez listeleniyor.
- IDENTITY sütunu bir ifadenin parçasıdır.
Bu koşullardan herhangi biri doğruysa, IDENTITY özelliğini devralma yerine NOT NULL sütunu oluşturulur.
CREATE TABLE AS SELECT
CREATE TABLE AS SELECT (CTAS), SELECT için belgelenen aynı SQL Server davranışını izler.. INTO. Ancak, deyiminin bölümünün sütun tanımında CREATE TABLE
bir IDENTITY özelliği belirtemezsiniz. CTAS bölümünde IDENTITY işlevini SELECT
de kullanamazsınız. Tabloyu doldurmak için, tabloyu tanımlamak ve ardından INSERT..SELECT
doldurmak için kullanmanız CREATE TABLE
gerekir.
Kimlik sütununa açıkça değer ekleme
Ayrılmış SQL havuzu söz dizimlerini destekler SET IDENTITY_INSERT <your table> ON|OFF
. IDENTITY sütununa değerleri açıkça eklemek için bu söz dizimini kullanabilirsiniz.
Birçok veri modelleyici, boyutlarında belirli satırlar için önceden tanımlanmış negatif değerler kullanmayı sever. Örnek olarak -1 veya "bilinmeyen üye" satırı gösteriliyor.
Sonraki betik, SET IDENTITY_INSERT kullanarak bu satırın nasıl açıkça ekleneceğini gösterir:
SET IDENTITY_INSERT dbo.T1 ON;
INSERT INTO dbo.T1
( C1
, C2
)
VALUES (-1,'UNKNOWN')
;
SET IDENTITY_INSERT dbo.T1 OFF;
SELECT *
FROM dbo.T1
;
Verileri yükleme
IDENTITY özelliğinin varlığı, veri yükleme kodunuz üzerinde bazı etkilere sahiptir. Bu bölümde, IDENTITY kullanarak tablolara veri yüklemeye yönelik bazı temel desenler vurgulanır.
Bir tabloya veri yüklemek ve IDENTITY kullanarak bir vekil anahtar oluşturmak için tabloyu oluşturun ve INSERT.. SEÇ veya EKLE.. Yükü gerçekleştirmek için DEĞERLER.
Aşağıdaki örnekte temel desen vurgulanır:
--CREATE TABLE with IDENTITY
CREATE TABLE dbo.T1
( C1 INT IDENTITY(1,1)
, C2 VARCHAR(30)
)
WITH
( DISTRIBUTION = HASH(C2)
, CLUSTERED COLUMNSTORE INDEX
)
;
--Use INSERT..SELECT to populate the table from an external table
INSERT INTO dbo.T1
(C2)
SELECT C2
FROM ext.T1
;
SELECT *
FROM dbo.T1
;
DBCC PDW_SHOWSPACEUSED('dbo.T1');
Not
Şu anda identity sütunu olan bir tabloya veri yüklerken kullanmak CREATE TABLE AS SELECT
mümkün değildir.
Verileri yükleme hakkında daha fazla bilgi için bkz. Ayrılmış SQL havuzu için Ayıklama, Yükleme ve Dönüştürme (ELT) Tasarlama ve En iyi yöntemleri yükleme.
Sistem görünümleri
IDENTITY özelliğine sahip bir sütunu tanımlamak için sys.identity_columns katalog görünümünü kullanabilirsiniz.
Veritabanı şemasını daha iyi anlamanıza yardımcı olmak için, bu örnekte sys.identity_column' öğesini diğer sistem kataloğu görünümleriyle tümleştirme gösterilmektedir:
SELECT sm.name
, tb.name
, co.name
, CASE WHEN ic.column_id IS NOT NULL
THEN 1
ELSE 0
END AS is_identity
FROM sys.schemas AS sm
JOIN sys.tables AS tb ON sm.schema_id = tb.schema_id
JOIN sys.columns AS co ON tb.object_id = co.object_id
LEFT JOIN sys.identity_columns AS ic ON co.object_id = ic.object_id
AND co.column_id = ic.column_id
WHERE sm.name = 'dbo'
AND tb.name = 'T1'
;
Sınırlamalar
Aşağıdaki durumlarda IDENTITY özelliği kullanılamaz:
- Sütun veri türü INT veya BIGINT olmadığında
- Sütun aynı zamanda dağıtım anahtarı olduğunda
- Tablo bir dış tablo olduğunda
Aşağıdaki ilgili işlevler ayrılmış SQL havuzunda desteklenmez:
Genel görevler
Bu bölümde, IDENTITY sütunlarıyla çalışırken sık kullanılan görevleri gerçekleştirmek için kullanabileceğiniz bazı örnek kodlar sağlanır.
C1 sütunu, aşağıdaki görevlerin tamamında yer alan IDENTITY'dir.
Tablo için en yüksek ayrılan değeri bulma
MAX()
Dağıtılmış tablo için ayrılan en yüksek değeri belirlemek için işlevini kullanın:
SELECT MAX(C1)
FROM dbo.T1
IDENTITY özelliğinin tohumunu ve artımını bulma
Aşağıdaki sorguyu kullanarak bir tablonun kimlik artırma ve dengeli yapılandırma değerlerini bulmak için katalog görünümlerini kullanabilirsiniz:
SELECT sm.name
, tb.name
, co.name
, ic.seed_value
, ic.increment_value
FROM sys.schemas AS sm
JOIN sys.tables AS tb ON sm.schema_id = tb.schema_id
JOIN sys.columns AS co ON tb.object_id = co.object_id
JOIN sys.identity_columns AS ic ON co.object_id = ic.object_id
AND co.column_id = ic.column_id
WHERE sm.name = 'dbo'
AND tb.name = 'T1'
;
Sonraki adımlar
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin