Pemilihan Rekod 10 Teratas Oracle: Penapisan, Susunan dan Pengoptimuman
Mendapatkan semula sepuluh rekod teratas dalam Oracle biasanya mudah, tetapi menambah penapis dan mengutamakan prestasi memperkenalkan cabaran. Soalan Limpahan Tindanan baru-baru ini menyerlahkan perkara ini, memfokuskan pada memilih sepuluh rekod teratas berdasarkan lajur tertentu sambil mengecualikan rekod yang memenuhi syarat tertentu.
Pertanyaan Asal dan Kekurangannya
Pertanyaan SQL awal bertujuan untuk memilih rekod unik berdasarkan beberapa kriteria: kapasiti storan bukan nol, pengecualian rekod dari tarikh tertentu dan susunan menurun mengikut kapasiti storan. Pertanyaan itu, bagaimanapun, gagal mengehadkan keputusan dengan betul kepada sepuluh teratas.
<code class="language-sql">SELECT DISTINCT APP_ID, NAME, STORAGE_GB, HISTORY_CREATED, TO_CHAR(HISTORY_DATE, 'DD.MM.YYYY') AS HISTORY_DATE FROM HISTORY WHERE STORAGE_GB IS NOT NULL AND APP_ID NOT IN (SELECT APP_ID FROM HISTORY WHERE TO_CHAR(HISTORY_DATE, 'DD.MM.YYYY') = '06.02.2009') </code>
Hanya menambah ROWNUM <= 10
pada pertanyaan ini tidak akan menghasilkan 10 teratas yang betul kerana ROWNUM
diberikan sebelum fasal ORDER BY
diproses.
Penyelesaian: Pendekatan Subkueri
Penyelesaian yang berkesan menggunakan subkueri untuk menggunakan penapisan dan pesanan dengan betul:
<code class="language-sql">SELECT * FROM ( SELECT DISTINCT APP_ID, NAME, STORAGE_GB, HISTORY_CREATED, TO_CHAR(HISTORY_DATE, 'DD.MM.YYYY') AS HISTORY_DATE FROM HISTORY WHERE STORAGE_GB IS NOT NULL AND APP_ID NOT IN (SELECT APP_ID FROM HISTORY WHERE TO_CHAR(HISTORY_DATE, 'DD.MM.YYYY') ='06.02.2009') ORDER BY STORAGE_GB DESC ) WHERE ROWNUM <= 10</code>
Struktur bersarang ini memastikan rekod dipesan dahulu, kemudian sepuluh teratas dipilih.
Peningkatan Prestasi
Di luar pembetulan susunan, menggunakan EXISTS
bukannya NOT IN
meningkatkan prestasi dengan ketara. EXISTS
secara amnya menawarkan peluang pengoptimuman yang lebih baik, meminimumkan penyertaan dan meningkatkan kelajuan pelaksanaan pertanyaan.
Atas ialah kandungan terperinci Bagaimana untuk Memilih 10 Rekod Teratas dalam Oracle dengan Cekap dengan Penapisan dan Pemesanan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!