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.
Bu makalede, ayrılmış SQL havuzundaki IDENTITY
tablolarda vekil anahtarlar oluşturmak için özelliğini kullanmaya yönelik öneriler ve örnekler bulacaksınız.
Surrogate key (vekil anahtar) nedir?
Tablodaki yedek anahtar, her satır için benzersiz bir tanımlayıcı içeren sütundur. Anahtar tablo verilerinden oluşturulmaz. Veri modelleyicileri, veri ambarı modelleri tasarlarken tablolarında vekil anahtarlar oluşturmayı sever. Bu hedefe ulaşmak için özelliğini yük performansını etkilemeden basit ve etkili bir şekilde kullanabilirsiniz IDENTITY
.
Not
Azure Synapse Analytics'te:
- IDENTITY değeri her dağıtımda kendi kendine artar ve diğer dağıtımlardaki IDENTITY değerleriyle çakışmaz. Synapse'teki IDENTITY değeri, kullanıcı
SET IDENTITY_INSERT ON
ile açıkça yinelenen bir değer eklediğinde veya IDENTITY'yi yeniden başlattığında benzersiz olacağı garanti edilmemektedir. Ayrıntılar için bkz. CREATE TABLE (Transact-SQL) IDENTITY (Özellik). - Dağıtım sütunundaKI UPDATE, IDENTITY değerinin benzersiz olduğunu 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 IDENTITY
'in uygulaması bu hedeflere ulaşmaya yöneliktir.
Tabloyu ilk kez oluşturduğunuzda, aşağıdaki cümleye benzer bir söz dizimi kullanarak IDENTITY
özelliğine sahip olacak şekilde 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 tabloyu doldurmak için 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
özelliği, IDENTITY
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'de yer aldı. İ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 özelliği tarafından IDENTITY
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ılmış bir tabloda sapmış veriler bulunuyorsa, veri türünün kullanılabilir değer aralığı erken tükenebilir. Örneğin, tüm veriler tek bir dağıtımla sonuçlanırsa, tablonun veri türünün yalnızca altıda birine erişimi olur. Bu nedenle özelliği IDENTITY
yalnızca ve INT
veri türleriyle BIGINT
sınırlıdır.
SELECT..INTO
Mevcut IDENTITY
sütun yeni bir tabloya seçildiğinde, aşağıdaki koşullardan biri geçerli olmadığı takdirde, yeni sütun IDENTITY
özelliğini devralır.
- Bu
SELECT
deyimi bir birleşim içerir. - Birden çok
SELECT
deyimUNION
kullanılarak birleştirilir. -
IDENTITY
sütunu,SELECT
listesinde birden fazla kez listeleniyor. -
IDENTITY
Sütun ifadenin bir parçasıdır.
Eğer bu koşullardan herhangi biri doğruysa, sütun, IDENTITY
özelliğini devralmak yerine NOT NULL
olarak oluşturulur.
TABLO OLUŞTUR SEÇİM OLARAK
CREATE TABLE AS SELECT
(CTAS), için SELECT..INTO
belgelenen aynı SQL Server davranışını izler. Ancak, ifadenin CREATE TABLE
kısmının sütun tanımında IDENTITY
özelliği belirtemezsiniz.
IDENTITY
işlevini CTAS SELECT
bölümünde de kullanamazsınız. Tabloyu doldurmak için önce CREATE TABLE
kullanarak tabloyu tanımlamanız, ardından INSERT..SELECT
kullanarak doldurmanız gerekir.
Identity sütununa açık değerler ekleme
Tahsis edilmiş SQL havuzu SET IDENTITY_INSERT <your table> ON|OFF
sözdizimini destekler. Bu söz dizimini kullanarak sütuna IDENTITY
açıkça değer ekleyebilirsiniz.
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.
Bir sonraki betik, SET IDENTITY_INSERT
kullanarak bu satırın açıkça nasıl 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
özelliğinin varlığının IDENTITY
veri yükleme kodunuz üzerinde bazı etkileri vardır. Bu bölümde IDENTITY
kullanarak tablolara veri yükleme için bazı temel kalıplar vurgulanır.
Kullanarak IDENTITY
, bir tabloya veri yüklemek ve vekil anahtar oluşturmak için tabloyu oluşturun ve ardından INSERT..SELECT
veya INSERT..VALUES
kullanarak yükleme işlemini gerçekleştirin.
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 CREATE TABLE AS SELECT
kullanmak mümkün değildir.
Verileri yükleme hakkında daha fazla bilgi için Ayrılmış SQL havuzları için Ayıklama, Yükleme ve Dönüştürme (ELT) Tasarımı ve Yükleme en iyi uygulamaları bölümlerine bakın.
Sistem görünümleri
özelliğine IDENTITY
katalog görünümünü kullanabilirsiniz.
Veritabanı şemasını daha iyi anlamanıza yardımcı olmak için bu örnekte diğer sistem kataloğu görünümleriyle tümleştirme sys.identity_columns
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
IDENTITY
özelliği kullanılamaz:
- Sütun veri türü veya değilse
INT
BIGINT
- 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
Sütunlarla IDENTITY
çalışırken yaygın görevleri gerçekleştirmek için aşağıdaki örnek kodu kullanabilirsiniz.
C1 sütunu aşağıdaki IDENTITY
tüm görevlerde yer alır.
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ği için başlangıç değeri ve artış miktarını bulma
Aşağıdaki sorguyu kullanarak bir tablonun kimlik artışı ve tohum 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'
;