Menggunakan IDENTITY untuk membuat kunci pengganti menggunakan kumpulan SQL khusus di Azure Synapse Analytics

Rekomendasi dan contoh untuk menggunakan properti IDENTITY untuk membuat kunci pengganti pada tabel di kumpulan SQL khusus.

Apa itu kunci pengganti

Tombol pengganti pada tabel adalah kolom dengan pengidentifikasi unik untuk setiap baris. Kunci tidak dihasilkan dari data tabel. Pemodel data suka membuat kunci pengganti di tabel mereka ketika mereka merancang model gudang data. Anda dapat menggunakan properti IDENTITY untuk mencapai tujuan ini secara sederhana dan efektif tanpa mempengaruhi kinerja beban.

Catatan

Di Azure Synapse Analytics:

  • Nilai IDENTITY meningkat sendiri di setiap distribusi dan tidak tumpang tindih dengan nilai IDENTITY dalam distribusi lain. Nilai IDENTITAS dalam Synapse tidak dijamin unik jika pengguna secara eksplisit menyisipkan nilai duplikat dengan "SET IDENTITY_INSERT ON" atau reseed IDENTITY. Untuk detailnya, lihat CREATE TABLE (Transact-SQL) IDENTITY (Properti).
  • PEMBARUAN pada kolom distribusi tidak menjamin nilai IDENTITY menjadi unik. Gunakan DBCC CHECKIDENT (Transact-SQL) setelah UPDATE pada kolom distribusi untuk memverifikasi keunikan.

Membuat tabel dengan kolom IDENTITY

Properti IDENTITY dirancang untuk menskalakan semua distribusi di kumpulan SQL khusus tanpa mempengaruhi kinerja beban. Oleh karena itu, implementasi IDENTITY berorientasi pada pencapaian tujuan tersebut.

Anda bisa menentukan tabel sebagai properti IDENTITY saat pertama kali membuat tabel dengan menggunakan sintaks yang mirip dengan pernyataan berikut:

CREATE TABLE dbo.T1
(    C1 INT IDENTITY(1,1) NOT NULL
,    C2 INT NULL
)
WITH
(   DISTRIBUTION = HASH(C2)
,   CLUSTERED COLUMNSTORE INDEX
)
;

Anda kemudian dapat menggunakan INSERT..SELECT untuk mengisi tabel.

Sisa bagian ini menyoroti nuansa implementasi untuk membantu Anda memahaminya secara lebih lengkap.

Alokasi nilai

Properti IDENTITY tidak menjamin urutan di mana nilai pengganti dialokasikan karena arsitektur gudang data yang didistribusikan. Properti IDENTITY dirancang untuk menskalakan semua distribusi di kumpulan SQL khusus tanpa mempengaruhi kinerja beban.

Contoh berikut adalah ilustrasi:

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');

Pada contoh sebelumnya, dua baris mendarat di distribusi 1. Baris pertama memiliki nilai pengganti 1 dalam kolom C1, dan baris kedua memiliki nilai pengganti 61. Kedua nilai ini dihasilkan oleh properti IDENTITY. Namun, alokasi nilai-nilai tersebut tidak berdekatan. Perilaku ini secara desain.

Data miring

Rentang nilai untuk jenis data tersebar merata di seluruh distribusi. Jika tabel terdistribusi menderita data miring, maka rentang nilai yang tersedia untuk jenis data dapat habis sebelum waktunya. Misalnya, jika semua data berakhir dalam satu distribusi, maka secara efektif tabel hanya memiliki akses ke satu-enam puluh nilai jenis data. Untuk alasan ini, properti IDENTITY terbatas dan hanya pada jenis data INT dan BIGINT.

SELECT..INTO

Saat kolom IDENTITY yang sudah ada dipilih ke dalam tabel baru, kolom baru mewarisi properti IDENTITY, kecuali salah satu kondisi berikut ini benar:

  • Pernyataan PILIH berisi gabungan.
  • Beberapa pernyataan PILIH digabungkan dengan menggunakan PERSATUAN.
  • Kolom IDENTITY dicantumkan lebih dari satu kali dalam daftar SELECT.
  • Kolom IDENTITY adalah bagian dari ekspresi.

Jika salah satu dari kondisi ini benar, kolom dibuat NOT NULL alih-alih mewarisi properti IDENTITY.

CREATE TABLE AS SELECT

CREATE TABLE AS SELECT (CTAS) mengikuti perilaku SQL Server yang sama yang didokumentasikan untuk SELECT..INTO. Namun, Anda tidak dapat menentukan properti IDENTITY dalam definisi kolom CREATE TABLE bagian dari pernyataan. Anda juga tidak dapat menggunakan fungsi IDENTITY di bagian SELECT CTAS. Untuk mengisi tabel, Anda perlu menggunakan CREATE TABLE untuk menentukan tabel diikuti INSERT..SELECT untuk mengisinya.

Menyisipkan nilai secara eksplisit ke dalam kolom IDENTITY

Kumpulan SQL khusus mendukung sintaksis SET IDENTITY_INSERT <your table> ON|OFF. Anda dapat menggunakan sintaks ini untuk menyisipkan nilai secara eksplisit ke dalam kolom IDENTITY.

Banyak pemodel data suka menggunakan nilai negatif yang telah ditentukan untuk baris tertentu dalam dimensinya. Contohnya adalah baris -1 atau "anggota tidak dikenal".

Skrip berikutnya memperlihatkan cara secara eksplisit menambahkan baris ini dengan menggunakan SET IDENTITAS_SISIPAN:

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
;

Memuat data

Kehadiran properti IDENTITY memiliki beberapa implikasi pada kode pemuatan data Anda. Bagian ini menyoroti beberapa pola dasar untuk memuat data ke dalam tabel dengan menggunakan IDENTITY.

Untuk memuat data ke dalam tabel dan menghasilkan kunci pengganti dengan menggunakan IDENTITY, buat tabel lalu gunakan INSERT..SELECT atau INSERT..VALUES untuk melakukan pemuatan.

Contoh berikut menyoroti pola dasar:

--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');

Catatan

Saat ini tidak dapat digunakan CREATE TABLE AS SELECT saat ini saat memuat data ke dalam tabel dengan kolom IDENTITY.

Untuk informasi selengkapnya tentang memuat data, lihat Merancang Ekstrak, Muat, dan Transformasi (ELT) untuk kumpulan SQL khusus dan Praktik terbaik pemuatan.

Tampilan sistem

Anda bisa menggunakan tampilan katalog sys.identity_columns untuk mengidentifikasi kolom yang memiliki properti IDENTITY.

Untuk membantu Anda lebih memahami skema database, contoh ini menunjukkan cara mengintegrasikan sys.identity_column' dengan tampilan katalog sistem lainnya:

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'
;

Batasan

Properti IDENTITY tidak dapat digunakan:

  • Saat jenis data kolom bukan INT atau BIGINT
  • Saat kolom juga merupakan kunci distribusi
  • Saat tabel adalah tabel eksternal

Fungsi terkait berikut ini tidak didukung dalam kumpulan SQL khusus:

Tugas umum

Bagian ini menyediakan beberapa sampel kode yang bisa Anda gunakan untuk melakukan tugas umum saat Anda bekerja dengan kolom IDENTITY.

Kolom C1 adalah IDENTITY di semua tugas berikut ini.

Menemukan nilai tertinggi yang dialokasikan untuk tabel

Gunakan fungsi MAX() untuk menentukan nilai tertinggi yang dialokasikan untuk tabel terdistribusi:

SELECT MAX(C1)
FROM dbo.T1

Menemukan seed dan kenaikan untuk properti IDENTITY

Anda bisa menggunakan tampilan katalog untuk menemukan kenaikan identitas dan nilai konfigurasi seed untuk tabel dengan menggunakan kueri berikut ini:

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'
;

Langkah berikutnya