Prestasi PostgreSQL & Pengoptimuman Pertanyaan · Pelajaran

Mengoptimumkan Pertanyaan dengan FILTER dan Pengagregatan Bersyarat

Pelajari cara klausa FILTER dan pengagregatan bersyarat berasaskan CASE membolehkan anda mengira berbilang metrik dalam satu laluan jadual, bukannya menjalankan beberapa pertanyaan berasingan.

Pelajaran 4 daripada 413 langkah

Mengoptimumkan Pertanyaan dengan FILTER dan Pengagregatan Bersyarat ialah pelajaran Prestasi PostgreSQL & Pengoptimuman Pertanyaan percuma di CoddyKit. Ini ialah pelajaran 4 daripada 4. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Prestasi PostgreSQL & Pengoptimuman Pertanyaan, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Prestasi PostgreSQL & Pengoptimuman Pertanyaan merangkumi sejumlah 4 pelajaran.

Masalahnya: Banyak Kiraan, Satu Jadual

Papan pemuka sering memerlukan beberapa metrik daripada jadual yang sama — jumlah pesanan, pesanan berbayar dan pesanan yang dipulangkan. Menjalankan tiga pertanyaan berasingan mengimbas jadual tiga kali. Kita boleh melakukannya dalam satu laluan.

Pengagregatan Bersyarat dengan CASE

Helah klasiknya ialah membungkus CASE di dalam agregat. Baris yang tidak sepadan menyumbang NULL, yang diabaikan oleh COUNT dan SUM.

SELECT
  COUNT(*) AS total,
  COUNT(CASE WHEN status = 'paid' THEN 1 END) AS paid
FROM orders;

Klausa FILTER yang Lebih Kemas

PostgreSQL menawarkan bentuk yang lebih mudah dibaca: klausa FILTER yang dilampirkan pada mana-mana agregat. Klausa ini menyatakan maksud secara langsung.

SELECT
  COUNT(*) AS total,
  COUNT(*) FILTER (WHERE status = 'paid')     AS paid,
  COUNT(*) FILTER (WHERE status = 'refunded') AS refunded
FROM orders;

Mengapa Ini Lebih Pantas

Semua metrik dikira dalam satu imbasan jadual. Perancang membaca setiap baris sekali dan mengemas kini setiap agregat, bukannya mengimbas jadual secara berasingan untuk setiap metrik.

FILTER dengan SUM dan AVG

FILTER berfungsi dengan mana-mana agregat, bukan COUNT sahaja. Kira jumlah dan purata bersyarat dalam pertanyaan yang sama.

SELECT
  SUM(total) FILTER (WHERE status = 'paid') AS revenue,
  AVG(total) FILTER (WHERE status = 'paid') AS avg_paid
FROM orders;

Menggabungkan dengan GROUP BY

FILTER amat berguna dalam pertanyaan berkumpulan, lalu menghasilkan hasil seperti pangsi dengan satu baris bagi setiap kumpulan dan beberapa lajur bersyarat.

SELECT
  region,
  COUNT(*) FILTER (WHERE status = 'paid')     AS paid,
  COUNT(*) FILTER (WHERE status = 'refunded') AS refunded
FROM orders
GROUP BY region;

Memangsimkan Bulan Menjadi Lajur

Laporan biasa menukar baris menjadi lajur. FILTER menghasilkan pangsi bulanan yang kemas tanpa fungsi sambungan.

SELECT
  product_id,
  SUM(total) FILTER (WHERE month = 1) AS jan,
  SUM(total) FILTER (WHERE month = 2) AS feb
FROM sales
GROUP BY product_id;

Membaca Pelan

EXPLAIN ANALYZE mengesahkan satu nod Aggregate di atas satu imbasan. Bandingkan dengan tiga pertanyaan berasingan untuk melihat imbasan yang dijimatkan.

EXPLAIN ANALYZE
SELECT
  COUNT(*) FILTER (WHERE status = 'paid') AS paid,
  COUNT(*) FILTER (WHERE status = 'refunded') AS refunded
FROM orders;

FILTER berbanding WHERE

Ingat perbezaannya:

  • WHERE membuang baris sebelum mana-mana agregat melihatnya
  • FILTER mengekalkan semua baris tetapi mengehadkan baris yang dikira oleh agregat tertentu

Gunakan FILTER apabila agregat yang berbeza memerlukan syarat yang berbeza.

Menggabungkan dengan Indeks

Jika kebanyakan metrik menyasarkan subset (contohnya, hanya baris terkini), tambahkan WHERE untuk syarat yang dikongsi supaya indeks mengecilkan imbasan, kemudian gunakan FILTER untuk pemisahan bagi setiap metrik.

SELECT
  COUNT(*) FILTER (WHERE status = 'paid') AS paid
FROM orders
WHERE created_at >= now() - interval '30 days';

Mengira Nilai Berbeza Secara Bersyarat

FILTER juga boleh digandingkan dengan COUNT(DISTINCT ...), lalu membolehkan anda mengira pelanggan unik bagi setiap status dalam satu imbasan dan bukannya beberapa pertanyaan berkumpulan.

SELECT
  COUNT(DISTINCT customer_id) FILTER (WHERE status = 'paid') AS paying_customers
FROM orders;

Semakan Pantas

Uji pengetahuan anda tentang pengagregatan bersyarat.

Rumusan

Anda telah mempelajari pengagregatan bersyarat:

  • Kira banyak metrik dalam satu imbasan dengan FILTER atau CASE
  • FILTER lebih mudah dibaca dan berfungsi dengan mana-mana agregat
  • Gabungkan dengan GROUP BY untuk laporan bergaya pangsi
  • WHERE membuang baris; FILTER mengehadkan satu agregat
  • Tambahkan WHERE yang dikongsi supaya indeks mengecilkan imbasan
Percuma untuk bermula

Pelajari SQL dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
22
Pelajaran
88

Soalan Lazim

Adakah pelajaran “Mengoptimumkan Pertanyaan dengan FILTER dan Pengagregatan Bersyarat” percuma?

Ya — sebanyak 3 pelajaran dalam laluan pembelajaran Prestasi PostgreSQL & Pengoptimuman Pertanyaan, termasuk “Mengoptimumkan Pertanyaan dengan FILTER dan Pengagregatan Bersyarat”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus Prestasi PostgreSQL & Pengoptimuman Pertanyaan merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Mengoptimumkan Pertanyaan dengan FILTER dan Pengagregatan Bersyarat”?

Pelajari cara klausa FILTER dan pengagregatan bersyarat berasaskan CASE membolehkan anda mengira berbilang metrik dalam satu laluan jadual, bukannya menjalankan beberapa pertanyaan berasingan. Anda berlatih Prestasi PostgreSQL & Pengoptimuman Pertanyaan menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Prestasi PostgreSQL & Pengoptimuman Pertanyaan?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Prestasi PostgreSQL & Pengoptimuman Pertanyaan di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 4 daripada 4.

Berapa lamakah pelajaran “Mengoptimumkan Pertanyaan dengan FILTER dan Pengagregatan Bersyarat” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Prestasi PostgreSQL & Pengoptimuman Pertanyaan ini?

Ya. Setiap pelajaran Prestasi PostgreSQL & Pengoptimuman Pertanyaan menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Mengoptimumkan Agregat dan Fungsi Tetingkap
  2. CTE Rekursif dan Pertanyaan Graf
  3. Menggunakan Pandangan Terwujud untuk Prestasi
  4. Mengoptimumkan Pertanyaan dengan FILTER dan Pengagregatan Bersyarat
← Kembali ke Prestasi PostgreSQL & Pengoptimuman Pertanyaan