Aracılığıyla paylaş


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 C11 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