Dalam jawabannya untuk Mana yang lebih baik: kolom identitas atau menghasilkan nilai id unik? mrdenny berkata:
Ketika SQL Denali keluar, itu akan mendukung urutan yang akan lebih efisien daripada identitas, tetapi Anda tidak dapat membuat sesuatu yang lebih efisien sendiri.
Saya tidak yakin. Mengetahui urutan Oracle , saya harus membuat pemicu untuk memasukkan, merangkum setiap insert ke dalam panggilan prosedur tersimpan, atau berdoa agar saya tidak lupa untuk menggunakan urutan dengan benar ketika saya melakukan insert ad-hoc.
Saya ragu bahwa keuntungan dari urutan sangat jelas.
sql-server
sql-server-2012
sequence
bernd_k
sumber
sumber
Jawaban:
Saya akan menjawab di sini juga. Itu ada hubungannya dengan internal tentang bagaimana
IDENTITY
danSEQUENCE
bekerja.Dengan
IDENTITY
, SQL Server pre-cache nilai ke dalam memori sehingga mereka tersedia. Lihat jawaban Martin Smith untuk detailnya. Saat nilai digunakan, proses latar belakang menghasilkan lebih banyak nilai. Seperti yang dapat Anda bayangkan, kumpulan ini dapat habis dengan cepat, meninggalkan aplikasi karena proses latar belakang yang menghasilkan nilai.Dengan
SEQUENCE
, SQL Server memungkinkan Anda menentukan seberapa besar cache seharusnya. Meskipun SQL Server tidak benar-benar menyimpan nilai dalam cache, itu hanya menyimpan nilai saat ini dan nilai akhir atas, ini akan sangat mengurangi jumlah IO yang diperlukan untuk membuat nilai.Jangan mengatur cache terlalu tinggi, karena ini akan mengurangi jumlah angka yang dapat digunakan: jika SQL Server crash, nilai apa pun yang ditentukan dalam kisaran cache saat ini yang tidak digunakan akan hilang.
Adapun penyisipan baris, cukup tentukan nilai default untuk kolom, seperti:
sumber
Sejak artikel Itzik Ben Gan ditulis, ukuran cache 10 hardcoded
IDENTITY
tampaknya telah diubah. Dari komentar di item hubungkan iniBuku T-SQL Querying berisi tabel berikut tetapi menekankan bahwa nilai-nilai ini tidak didokumentasikan atau dijamin tidak berubah.
Artikel di sini menguji berbagai ukuran cache urutan dan memasukkan ukuran kumpulan dan muncul dengan hasil berikut.
Yang tampaknya menunjukkan bahwa untuk sisipan besar
IDENTITY
berkinerjaSEQUENCE
. Namun ia tidak menguji ukuran cache 1.000 dan juga hasil tersebut hanya satu tes. Melihat secara khusus pada ukuran cache 1.000 dengan berbagai ukuran bets sisipan, saya mendapatkan hasil berikut (mencoba setiap ukuran bets 50 kali dan menggabungkan hasilnya sebagai di bawah ini - semua kali dalam μs.)Untuk ukuran batch yang lebih besar,
IDENTITY
versi umumnya lebih cepat .Buku Kueri TSQL juga menjelaskan mengapa
IDENTITY
bisa memiliki keunggulan kinerja dibandingkan urutan.Ini
IDENTITY
adalah tabel khusus danSEQUENCE
tidak. Jika bencana terjadi pada pertengahan sisipan sebelum log buffer disiram, tidak masalah jika identitas yang dipulihkan adalah yang sebelumnya karena proses pemulihan juga akan membatalkan sisipan, sehingga SQL Server tidak memaksa pembilasan log buffer pada setiap identitas cache terkait menulis disk. Namun untuk urutan ini adalah ditegakkan sebagai nilai dapat digunakan untuk tujuan apapun - termasuk di luar database. Jadi, dalam contoh di atas dengan sejuta sisipan dan ukuran cache 1.000 ini adalah tambahan ribu log flushes.Skrip untuk direproduksi
sumber