Urutan vs identitas

87

SQL Server 2012 diperkenalkan Sequencesebagai fitur baru, sama seperti di Oracle dan Postgres. Di mana urutan lebih disukai daripada identitas? Dan mengapa kita membutuhkan urutan?

Sleiman Jneidi
sumber
Setelah menggunakan keduanya, saya lebih memilih Identitas untuk penggunaan global dalam database. Yaitu, di mana Anda memerlukan angka yang bertambah secara otomatis seperti ObjectID dan ingin menggunakannya di banyak tabel. Membuat urutan menjadi rumit dan kemudian menggunakan aplikasi (situs web atau aplikasi dll) untuk mengelola penyisipan dan pembaruan tabel berdasarkan nomor urut.
volume satu

Jawaban:

81

Saya pikir Anda akan menemukan jawaban Anda di sini

Dengan menggunakan atribut identitas untuk kolom, Anda dapat dengan mudah menghasilkan angka yang bertambah otomatis (yang sering digunakan sebagai kunci utama). Dengan Sequence, ini akan menjadi objek berbeda yang dapat Anda lampirkan ke kolom tabel saat menyisipkan. Tidak seperti identitas, nomor berikutnya untuk nilai kolom akan diambil dari memori daripada dari disk - ini membuat Urutan jauh lebih cepat daripada Identitas. Kita akan melihat ini dalam contoh yang akan datang.

Dan di sini :

Urutan: Urutan telah diminta oleh komunitas SQL Server selama bertahun-tahun, dan itu termasuk dalam rilis ini. Urutan adalah objek yang ditentukan pengguna yang menghasilkan urutan angka. Berikut adalah contoh penggunaan Sequence.

dan di sini juga:

Objek urutan SQL Server menghasilkan urutan angka seperti kolom identitas dalam tabel sql. Tetapi keuntungan dari nomor urut adalah obyek nomor urut tidak dibatasi dengan tabel sql tunggal.

dan di msdn Anda juga dapat membaca lebih lanjut tentang penggunaan dan mengapa kami membutuhkannya (di sini ):

Urutan adalah objek terikat skema yang ditentukan pengguna yang menghasilkan urutan nilai numerik sesuai dengan spesifikasi urutan dibuat. Urutan nilai numerik dihasilkan dalam urutan naik atau turun pada interval yang ditentukan dan dapat berputar (berulang) seperti yang diminta. Urutan, tidak seperti kolom identitas, tidak terkait dengan tabel. Aplikasi mengacu pada objek urutan untuk menerima nilai berikutnya. Hubungan antara urutan dan tabel dikendalikan oleh aplikasi. Aplikasi pengguna dapat mereferensikan objek urutan dan mengoordinasikan kunci nilai di beberapa baris dan tabel.

Urutan dibuat secara terpisah dari tabel dengan menggunakan pernyataan CREATE SEQUENCE. Opsi memungkinkan Anda untuk mengontrol kenaikan, nilai maksimum dan minimum, titik awal, kemampuan memulai ulang otomatis, dan cache untuk meningkatkan kinerja. Untuk informasi tentang opsi, lihat BUAT URUTAN.

Tidak seperti nilai kolom identitas, yang dihasilkan saat baris disisipkan, aplikasi dapat memperoleh nomor urut berikutnya sebelum menyisipkan baris dengan memanggil fungsi NEXT VALUE FOR. Nomor urut dialokasikan ketika NEXT VALUE FOR dipanggil bahkan jika nomor tersebut tidak pernah dimasukkan ke dalam tabel. Fungsi NEXT VALUE FOR dapat digunakan sebagai nilai default untuk kolom dalam definisi tabel. Gunakan sp_sequence_get_range untuk mendapatkan berbagai nomor urutan sekaligus.

Urutan dapat didefinisikan sebagai tipe data integer apa pun. Jika tipe data tidak ditentukan, urutan defaultnya adalah bigint.

Arion
sumber
21

Urutan dan identitas keduanya digunakan untuk menghasilkan nomor otomatis tetapi perbedaan utamanya adalah Identitas bergantung pada tabel dan Urutan tidak bergantung pada tabel.

Jika Anda memiliki skenario di mana Anda perlu mempertahankan nomor otomatis secara global (dalam beberapa tabel), Anda juga perlu memulai ulang interval Anda setelah nomor tertentu dan Anda perlu menyimpannya juga untuk kinerja, inilah tempat di mana kita membutuhkan urutan dan bukan identitas.

pengguna1059637
sumber
14

Meskipun urutan memberikan lebih banyak fleksibilitas daripada kolom identitas, saya tidak menemukan mereka memiliki manfaat kinerja apa pun.

Saya menemukan kinerja menggunakan identitas secara konsisten 3x lebih cepat daripada menggunakan urutan untuk penyisipan batch.

Saya memasukkan sekitar 1,5 juta baris dan kinerjanya adalah:

  • 14 detik untuk identitas
  • 45 detik untuk urutan

Saya memasukkan baris ke dalam tabel yang menggunakan objek urutan melalui default tabel:

NEXT VALUE for <seq> for <col_name>

dan juga mencoba menentukan nilai urutan dalam pernyataan pilih:

SELECT NEXT VALUE for <seq>, <other columns> from <table>

Keduanya merupakan faktor yang sama lebih lambat dari metode identitas. Saya menggunakan opsi cache default untuk urutan tersebut.

Artikel yang direferensikan di tautan pertama Arion menunjukkan kinerja untuk penyisipan baris demi baris dan perbedaan antara identitas dan urutan adalah 16,6 detik hingga 14,3 detik untuk 10.000 sisipan.

Opsi Caching berdampak besar pada kinerja, tetapi identitas lebih cepat untuk volume yang lebih tinggi (+ 1 juta baris)

Lihat tautan ini untuk analisis mendalam sesuai komentar utly4life.

Stagg
sumber
Berapa ukuran cache dari urutan tersebut.
Shannon Severance
50, meningkatkannya memang membuat perbedaan, tetapi saya mengingat identitas masih lebih cepat.
Stagg
2
byobi.com/blog/2012/09/… Memberikan perbandingan rinci yang baik dari berbagai konfigurasi. Menunjukkan bahwa peningkatan ukuran cache dari 50 menjadi 500 menghasilkan kira-kira perbedaan kecepatan 2x.
ulty4life
1
Apakah Anda menyarankan urutan lebih lambat dari kolom identitas? Saya mendapat kesan berlawanan karena urutan berada dalam memori tidak seperti identitas yang diambil dari disk. Temuan Anda cukup mengejutkan. Senang Anda berbagi.
NSP
1
dengan urutan Anda dapat mengoptimalkan kinerja penyisipan batch dengan menggunakan alter sequence increment by ...untuk membuat ruang bagi baris baru Anda dan kemudian menggunakan basis + nomor_ baris () atau apa pun untuk nilai sebenarnya.
gordy
6

Saya tahu ini agak tua, tetapi ingin menambahkan pengamatan yang menggigit saya.

Saya beralih dari identitas ke urutan agar indeks saya berurutan. Saya kemudian menemukan bahwa urutan tidak ditransfer dengan replikasi. Saya mulai mendapatkan pelanggaran kunci setelah saya menyiapkan replikasi antara dua database karena urutannya tidak sinkron. hanya sesuatu yang harus diperhatikan sebelum Anda membuat keputusan.

Ken
sumber
3

Saya menemukan penggunaan terbaik dari Urutan bukanlah untuk mengganti kolom identitas tetapi untuk membuat jenis bidang "Nomor Pesanan".

Dengan kata lain, Nomor Pesanan diperlihatkan kepada pengguna akhir dan mungkin memiliki aturan bisnis yang menyertainya. Anda ingin itu unik, tetapi hanya menggunakan Kolom Identitas juga tidak benar.

Misalnya, jenis pesanan yang berbeda mungkin memerlukan urutan yang berbeda, jadi Anda mungkin memiliki urutan untuk Pesanan Internet, bukan pesanan In-house.

Dengan kata lain, jangan menganggap Urutan sebagai pengganti identitas yang sederhana, anggap saja itu berguna dalam kasus di mana identitas tidak sesuai dengan persyaratan bisnis.

Greg Gum
sumber
1

Baru-baru ini digigit sesuatu yang perlu dipertimbangkan untuk identitas vs urutan. Tampaknya MSFT sekarang menyarankan urutan jika Anda ingin mempertahankan identitas tanpa celah. Kami memiliki masalah di mana ada celah besar dalam identitas, tetapi berdasarkan pernyataan ini yang disorot akan menjelaskan masalah kami bahwa SQL menyimpan identitas dan setelah reboot kami kehilangan nomor tersebut.

https://docs.microsoft.com/en-us/sql/t-sql/statements/create-table-transact-sql-identity-property?view=sql-server-2017

Nilai berurutan setelah server restart atau kegagalan lainnya - SQL Server mungkin menyimpan nilai identitas untuk alasan kinerja dan beberapa nilai yang ditetapkan bisa hilang selama kegagalan database atau server restart. Hal ini dapat menyebabkan kesenjangan dalam nilai identitas saat dimasukkan. Jika celah tidak dapat diterima maka aplikasi harus menggunakan mekanismenya sendiri untuk menghasilkan nilai kunci. Menggunakan generator urutan dengan opsi NOCACHE dapat membatasi celah untuk transaksi yang tidak pernah dilakukan.

awilbourn
sumber
1
Ada jawaban yang cukup bagus mengapa Anda melewatkan tautanIDENTITY nomor dan memiliki masalah yang sama seperti yang dijelaskan di sini tautan tetapi Anda dapat membatasinya dengan mengatur ukuran CACHE yang lebih kecil tetapi kemudian ada trade off dengan kecepatan. SEQUENCE
Mrphin