Saya mengerti bahwa Anda tidak dapat memiliki ORDER BY
pandangan. (Setidaknya dalam SQL Server 2012 saya bekerja dengan)
Saya juga mengerti bahwa cara "benar" untuk menyortir tampilan adalah dengan meletakkan ORDER BY
sekitar SELECT
pernyataan yang meminta tampilan.
Tetapi karena relatif baru untuk SQL praktis dan penggunaan pandangan, saya ingin memahami mengapa ini dilakukan dengan desain. Jika saya telah mengikuti sejarah dengan benar, ini pernah mungkin dan secara eksplisit dihapus dari SQL Server 2008 dan seterusnya (jangan mengutip saya pada versi yang tepat).
Namun, alasan terbaik yang dapat saya kemukakan mengapa Microsoft menghapus fitur ini adalah karena "sebuah tampilan adalah kumpulan data yang tidak disortir".
Saya berasumsi ada alasan logis yang bagus mengapa Tampilan harus tidak disortir. Mengapa tampilan tidak bisa hanya menjadi kumpulan data yang rata? Mengapa khusus tidak disortir? Tampaknya tidak sulit untuk menemukan situasi di mana (setidaknya bagi saya / IMHO) tampaknya sangat intuitif untuk memiliki tampilan yang diurutkan.
sumber
Jawaban:
(Di samping pandangan yang diindeks, tentu saja.)
Tampilan tidak terwujud - data tidak disimpan, jadi bagaimana bisa diurutkan? Tampilan seperti prosedur tersimpan yang hanya berisi
SELECT
tanpa parameter ... itu tidak menyimpan data, itu hanya memegang definisi permintaan. Karena referensi yang berbeda untuk tampilan bisa memerlukan data yang diurutkan dengan cara yang berbeda, cara Anda melakukan ini - seperti memilih dari tabel, yang juga merupakan kumpulan baris yang tidak disortir, menurut definisi - adalah dengan memasukkan urutan pesanan pada kueri luar .Juga untuk memberi sedikit wawasan tentang sejarah. Anda bisa tidak pernah dimasukkan ke
ORDER BY
dalam sebuah tampilan, tanpa juga termasukTOP
. Dan dalam hal iniORDER BY
baris yang ditentukan dimasukkanTOP
, bukan bagaimana mereka akan disajikan. Itu hanya kebetulan bahwa dalam SQL Server 2000, jikaTOP
itu100 PERCENT
atau{some number >= number of rows in the table}
, optimizer cukup sederhana dan akhirnya menghasilkan sebuah rencana dengan semacam yang cocok denganTOP/ORDER BY
. Tapi perilaku ini tidak pernah dijamin atau didokumentasikan - itu hanya didasarkan pada pengamatan, yang merupakan kebiasaan buruk . Ketika SQL Server 2005 keluar, perilaku ini mulai "melanggar" karena perubahan dalam pengoptimal yang menyebabkan berbagai rencana dan operator yang digunakan - antara lain,TOP / ORDER BY
akan diabaikan sepenuhnya jika ituTOP 100 PERCENT
. Beberapa pelanggan mengeluhkan hal ini dengan sangat keras sehingga Microsoft mengeluarkan tanda bendera untuk mengembalikan perilaku lama. Saya tidak akan memberi tahu Anda apa benderanya karena saya tidak ingin Anda menggunakannya dan saya ingin memastikan bahwa maksudnya benar - jika Anda ingin urutan pengurutan yang dapat diprediksi, gunakanORDER BY
pada permintaan luar.Untuk meringkas dan hanya untuk memperjelas poin yang Anda buat: Microsoft tidak menghapus apa pun. Mereka membuat produk lebih baik, dan sebagai efek samping dari perilaku yang tidak berdokumen dan tidak dijamin ini menjadi kurang dapat diandalkan. Secara keseluruhan, saya pikir produknya lebih baik.
sumber
TOP
melakukan operasi kursor atas hasil yang ditetapkan. Untuk itu dapat memiliki perintah eksplisit.TOP 100 PERCENT / ORDER BY
dan menghapusnya dari paket sepenuhnya. Cobalah.Jika tampilan dibiarkan disortir, lalu apa urutan hasil di sini?
sumber
satu kemungkinan adalah untuk menghindari jenis yang bertentangan - jika tampilan disortir berdasarkan satu urutan dan pilih pada tampilan yang disortir oleh urutan lain (tidak menyadari jenis tampilan), mungkin ada kinerja yang memukul. Jadi lebih aman untuk meninggalkan persyaratan penyortiran kepada pengguna.
alasan lain, sortir datang dengan biaya kinerja, jadi mengapa menghukum semua pengguna tampilan, ketika hanya beberapa pengguna yang membutuhkan sortir itu ..
sumber
ANSI SQL hanya memungkinkan
ORDER BY
kueri terluar untuk berbagai alasan, salah satunya adalah apa yang terjadi ketika subselect / view / CTE digabungkan ke tabel lain dan kueri luar memilikiORDER BY
itu sendiri.SQL server tidak pernah mendukungnya dalam tampilan (kecuali jika Anda menipu menggunakan
TOP 100 PERCENT
yang menurut saya sebagian besar memicu bug).Bahkan jika Anda memicu bug, hasilnya tidak pernah dapat diandalkan, dan penyortiran tidak selalu sesuai dengan yang Anda harapkan.
Lihat posting blog ini oleh tim Pengoptimal Permintaan untuk penjelasan teknis lengkap TOP 100 Persen ORDER OLEH Dianggap Berbahaya.
sumber
Tampilan berperilaku seperti tabel yang isinya ditentukan oleh hasil kueri.
Tabel tidak memiliki pesanan; mereka hanya sekumpulan baris.
Oleh karena itu, pandangan tidak memiliki urutan. Anda dapat mengurutkannya dengan memilih baris dalam ORDER tertentu.
sumber
Satu jawaban yang belum diberikan adalah bahwa "pesanan oleh" dapat mengganggu pendorong predikat yang dapat sangat mempengaruhi kinerja.
Contohnya adalah memiliki tampilan yang menggulung set besar data ke dalam ringkasan 10 baris yang berada di atas 10 / Dipesan:
Untuk kasus yang sama dengan predikat kuat:
Masih membutuhkan jumlah waktu yang sama karena top / order dengan memblokir predikat dari dijalankan sebelumnya dalam pipa. Ini dapat menyebabkan baris yang tidak dibutuhkan diproses dan rencananya akan serupa dengan yang tanpa predikat.
Apakah dorongan harus terjadi sebelum pesanan oleh benar-benar pilihan pengembang dan dapat mengubah jawabannya. Paling sering dorongan adalah niat logis.
Menggunakan "top 100 persen" secara logis memungkinkan pendorong mendorong namun implementasi sayangnya mengabaikan "pesanan oleh" untuk kasus ini dan mengalahkan tujuannya.
Untuk kasus penggunaan nyata, kompromi yang bagus akan membuat mesin melakukan "pesanan dengan menarik." Ini akan memungkinkan "pesanan oleh" ditentukan dalam tampilan (dengan 100 persen teratas atau tanpa puncak) dan pesanan itu hanya digunakan jika tampilan dipilih secara langsung, tanpa urutan eksplisit oleh, tanpa gabungan, tanpa agregat, tanpa lihat rantai dll. Kedua kasus yang tercantum di atas dapat didukung oleh model sederhana ini.
sumber
Anda dapat membuat tampilan yang telah dipesan oleh dan mempertahankan pesanan saat ditanya setelah:
pilih top 99,99999999999999 persen * dari ..... dipesan oleh
sumber
SELECT TOP 100 PERCENT ...
?