Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Tentukan baris terbaru yang ditambahkan ketika tidak ada indeks

Tidak, tidak ada fungsi standar di SQL Server yang akan mengembalikan "baris terakhir" dari sebuah tabel.

Menurut definisi, tabel adalah kumpulan baris yang tidak berurutan. Bayangkan Anda melempar seikat kelereng ke dalam tas. Sekarang buka tasnya dan tanyakan pada orang lain kelereng mana yang masuk lebih dulu atau terakhir. Sekarang lempar semuanya ke lantai, dan ketika orang lain masuk ke dalam ruangan, tanyakan kepada mereka mana yang menyentuh lantai lebih dulu atau terakhir. Anda tidak dapat melakukannya, karena tidak ada informasi tambahan yang menunjukkan apa pun tentang urutan jatuhnya mereka.

Hal yang sama berlaku untuk tabel di SQL Server. Kecuali Anda menambahkan kolom IDENTITY, atau kolom datetime, atau pemicu, atau menggunakan fungsionalitas eksternal seperti pelacakan perubahan, CDC, audit, dll., SQL Server tidak dapat memberi tahu Anda baris mana yang dimasukkan terakhir. Anda mungkin berpikir yang hanya memilih dari tabel tanpa urutan dengan klausa terlihat seperti mengembalikan data dalam urutan yang benar, ini murni kebetulan. Ini contohnya:

CREATE TABLE dbo.floobat
(
  ID INT PRIMARY KEY, 
  n VARCHAR(16), 
  x CHAR(4000) NOT NULL DEFAULT ''
);

INSERT dbo.floobat(ID,n) VALUES(1,'Sparky');
INSERT dbo.floobat(ID,n) VALUES(2,'Aaron');
INSERT dbo.floobat(ID,n) VALUES(3,'Norbert'); -- <-- inserted last

SELECT ID, n FROM dbo.floobat;

Oke, jadi secara default, ini sepertinya baik-baik saja. Hasil:

ID    n
--    -------
1     Sparky
2     Aaron
3     Norbert -- < yes, this is right

Namun, mari kita buat perubahan pada tabel yang tidak diketahui oleh aplikasi Anda atau apa pun yang bergantung pada urutan di atas:

CREATE NONCLUSTERED INDEX x ON dbo.floobat(n);

SELECT ID, n FROM dbo.floobat;

Uh oh! Hasil:

ID    n
--    -------
2     Aaron
3     Norbert
1     Sparky -- < oops, this is no longer right

Anda harus ingat ini:jika Anda tidak menyertakan klausa ORDER BY, Anda memberi tahu SQL Server yang Anda tidak peduli tentang pesanan. Jadi itu akan menemukan cara paling efisien untuk mengembalikan data, dan itu dapat menyebabkan pemesanan yang diamati berbeda. Menambahkan indeks di atas memberi SQL Server jalur akses yang lebih baik untuk mengambil data. Itu masih menggunakan pemindaian, tetapi indeks itu jauh lebih tipis daripada indeks berkerumun (yang hanya dapat memuat dua baris dalam satu halaman).

Bahkan tanpa indeks, Anda mungkin tidak akan mendapatkan hasil yang diharapkan, karena berbelit-belit oleh fakta bahwa Cust_ID Anda kolom tidak dimasukkan dalam urutan menaik. Jadi jika Anda memasukkan 5 dan dari 2 , memilih tanpa ORDER BY sebenarnya akan menghasilkan 2 lalu 5 (dengan asumsi tidak ada indeks yang lebih baik).

Hal-hal lain selain membuat (atau menjatuhkan, atau mengubah, atau membangun kembali) indeks dapat menyebabkan jenis perubahan yang sama dalam perilaku pemesanan. Terapkan paket layanan, CU atau hotfix; membilas cache prosedur; menggunakan berbagai opsi RECOMPILE; memperbarui statistik; memulai ulang server; menambahkan atau menonaktifkan tanda jejak; mengubah opsi opsi server; memindahkan database ke server yang berbeda; dll. dll.

Jadi, jika Anda ingin melacak informasi ini, Anda harus menambahkannya sendiri dengan cara tertentu, seperti yang telah dibahas oleh beberapa jawaban lainnya.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Buat pemicu yang memasukkan nilai ke dalam tabel baru saat kolom diperbarui

  2. Mengonversi tanggal secara efektif antara waktu UTC dan Lokal (mis. PST) di SQL 2005

  3. menggabungkan bidang Tanggal dan Waktu ke DateTime, SQL Server 2008

  4. Bagaimana Cara Menggunakan UTF-8 Collation dalam database SQL Server?

  5. NOLOCK vs. Tingkat Isolasi Transaksi