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

Urutan baris default dalam kueri SELECT - SQL Server 2008 vs SQL 2012

Anda harus kembali dan menambahkan ORDER BY klausa kode Anda karena tanpa mereka pesanan tidak pernah dijamin. Anda "beruntung" di masa lalu karena Anda selalu mendapatkan urutan yang sama tetapi itu bukan karena SQL Server 2008 menjaminnya. Kemungkinan besar ada hubungannya dengan indeks Anda atau bagaimana data disimpan di disk.

Jika Anda pindah ke host baru saat Anda memutakhirkan, perbedaan dalam konfigurasi perangkat keras saja bisa mengubah cara kueri Anda dijalankan. Belum lagi fakta bahwa server baru akan menghitung ulang statistik pada tabel dan pengoptimal kueri SQL Server 2012 mungkin melakukan hal yang sedikit berbeda dari yang ada di SQL Server 2008.

Ini adalah kekeliruan bahwa Anda dapat mengandalkan urutan hasil yang ditetapkan dalam SQL tanpa secara eksplisit menyatakan urutan yang Anda inginkan. Hasil SQL TIDAK PERNAH dapatkan pesanan yang dapat Anda andalkan tanpa menggunakan ORDER BY ayat. SQL dibangun di sekitar teori himpunan. Hasil kueri pada dasarnya adalah kumpulan (atau kumpulan banyak).

Itzik Ben-Gan memberikan deskripsi yang baik tentang teori himpunan dalam kaitannya dengan SQL dalam bukunya Microsoft SQL Server 2012 T-SQL Fundamentals

Teori himpunan, yang berasal dari ahli matematika Georg Cantor, adalah salah satu cabang matematika yang menjadi dasar model relasional. Definisi himpunan dari Cantor adalah sebagai berikut:

Yang kami maksud dengan "set" adalah kumpulan M apa pun ke dalam keseluruhan objek m tertentu yang berbeda (yang disebut "elemen" M) dari persepsi atau pikiran kita. - Joseph W. Dauben dan Georg Cantor (PrincetonUniversity Press, 1990)

Setelah penjelasan menyeluruh dari istilah-istilah dalam definisi Itzik kemudian melanjutkan dengan mengatakan:

Apa yang ditinggalkan oleh definisi Cantor tentang himpunan mungkin sama pentingnya dengan apa yang termasuk di dalamnya. Perhatikan bahwa definisi tidak menyebutkan urutan apa pun di antara elemen-elemen yang ditetapkan. Urutan di mana elemen-elemen himpunan terdaftar tidak penting. Notasi formal untuk daftar elemen himpunan menggunakan tanda kurung kurawal:{a, b, c}. Karena urutan tidak memiliki relevansi, Anda dapat menyatakan himpunan yang sama dengan {b, a, c} atau {b, c, a}. Melompat ke kumpulan atribut (disebut kolom dalam SQL) yang membentuk header relasi (disebut tabel dalam SQL), sebuah elemen seharusnya diidentifikasi dengan nama - bukan posisi ordinal. Demikian pula, pertimbangkan kumpulan tupel (disebut baris oleh SQL) yang membentuk badan relasi; sebuah elemen diidentifikasi oleh nilai kuncinya - bukan berdasarkan posisi. Banyak pemrogram mengalami kesulitan beradaptasi dengan gagasan bahwa, sehubungan dengan kueri tabel, tidak ada urutan di antara baris. Dengan kata lain, kueri terhadap tabel dapat mengembalikan baris dalam urutan apa pun kecuali jika Anda secara eksplisit meminta agar data diurutkan dengan cara tertentu, mungkin untuk tujuan presentasi.

Tetapi terlepas dari definisi akademis dari satu set, bahkan implementasi di SQL server tidak pernah menjamin urutan apa pun dalam hasil. Entri blog MSDN ini dari tahun 2005 oleh anggota tim pengoptimal kueri menyatakan bahwa Anda tidak boleh mengandalkan pesanan dari operasi perantara sama sekali.

Aturan penataan ulang dapat dan akan melanggar asumsi ini (dan melakukannya jika tidak nyaman bagi Anda, pengembang;). Harap dipahami bahwa ketika kami menyusun ulang operasi untuk menemukan rencana yang lebih efisien, kami dapat menyebabkan perubahan perilaku pemesanan untuk node perantara di pohon. Jika Anda telah menempatkan operasi di pohon yang mengasumsikan urutan perantara tertentu, itu bisa rusak.

Posting blog ini oleh Conor Cunningham (Arsitek, SQL Server Core Engine) "No Seatbelt - Expecting Order without ORDER BY" adalah tentang SQL Server 2008. Dia memiliki tabel dengan 20k baris di dalamnya dengan indeks tunggal yang tampaknya selalu mengembalikan baris di urutan yang sama. Menambahkan ORDER BY ke kueri bahkan tidak mengubah rencana eksekusi, jadi tidak seperti menambahkannya membuat kueri lebih mahal jika pengoptimal menyadari bahwa itu tidak membutuhkannya. Tetapi begitu dia menambahkan 20 ribu baris lagi ke tabel, tiba-tiba rencana kueri berubah dan sekarang menggunakan paralelisme dan hasilnya tidak lagi berurutan!

Bagian yang sulit di sini adalah bahwa tidak ada cara yang masuk akal bagi pengguna eksternal untuk mengetahui kapan sebuah rencana akan berubah. Ruang dari semua rencana sangat besar dan membuat kepala Anda sakit untuk direnungkan. Pengoptimal SQL Server akan mengubah rencana, bahkan untuk kueri sederhana, jika cukup banyak parameter berubah. Anda mungkin beruntung dan tidak memiliki perubahan rencana, atau Anda tidak dapat memikirkan masalah ini dan menambahkan ORDER BY.

Jika Anda perlu lebih meyakinkan, baca saja posting ini:

  • Tanpa ORDER BY, tidak ada urutan pengurutan default. - Alexander Kuznetsov
  • Pesan di pengadilan! - Thomas Kyte
  • Urutan Hasil yang Ditetapkan dalam SQL - Timothy Wiseman



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server Azure / 2022 Tabel Buku Besar Database dari Linux.

  2. Urutan Eksekusi kueri SQL

  3. Kembalikan Semua Kunci Asing yang Mereferensikan Tabel yang Diberikan di SQL Server

  4. Cara mendapatkan Kuartal kalender dari tanggal di TSQL

  5. Kinerja SQL Server TOP CPU Query -2