SQL Server 2012 diperkenalkan Sequence
sebagai fitur baru, sama seperti di Oracle dan Postgres. Di mana urutan lebih disukai daripada identitas? Dan mengapa kita membutuhkan urutan?
sql
sql-server
tsql
sql-server-2012
Sleiman Jneidi
sumber
sumber
Jawaban:
Saya pikir Anda akan menemukan jawaban Anda di sini
Dan di sini :
dan di sini juga:
dan di msdn Anda juga dapat membaca lebih lanjut tentang penggunaan dan mengapa kami membutuhkannya (di sini ):
sumber
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.
sumber
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:
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.
sumber
alter sequence increment by ...
untuk membuat ruang bagi baris baru Anda dan kemudian menggunakan basis + nomor_ baris () atau apa pun untuk nilai sebenarnya.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.
sumber
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.
sumber
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.
sumber
IDENTITY
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