Dengan asumsi id
tidak hanya UNIQUE
- sebagaimana diberlakukan oleh UNIQUE INDEX
. Anda - tetapi juga NOT NULL
. (Itu tidak ada dalam definisi tabel Anda.)
SELECT meta_split.key, meta_split.value, count(*)
FROM voc_cc348779bdc84f8aab483f662a798a6a v
CROSS JOIN LATERAL jsonb_each(v.meta) AS meta_split
GROUP BY meta_split.key, meta_split.value;
Setara lebih pendek:
SELECT meta_split.key, meta_split.value, count(*)
FROM voc_cc348779bdc84f8aab483f662a798a6a v, jsonb_each(v.meta) AS meta_split
GROUP BY 1, 2;
LEFT [OUTER] JOIN
adalah kebisingan karena tes berikut WHERE meta_split.value IS NOT NULL
memaksa INNER JOIN
omong-omong. Menggunakan CROSS JOIN
sebagai gantinya.
Juga, karena jsonb
tidak mengizinkan kunci duplikat pada level yang sama (artinya id
yang sama hanya dapat muncul sekali per (key, value)
), DISTINCT
hanya kebisingan mahal. count(v.id)
melakukan hal yang sama lebih murah. Dan count(*)
setara, dan lebih murah, namun - dengan asumsi id
adalah NOT NULL
seperti yang dinyatakan di atas.
count(*)
memiliki implementasi terpisah
dan sedikit lebih cepat dari count(<value>)
. Ini agak berbeda dari count(v.*)
. Itu menghitung semua baris, apa pun yang terjadi. Sedangkan form lainnya tidak menghitung NULL
nilai.
Artinya, selama id
tidak boleh NULL
- seperti yang dinyatakan di atas. id
harus benar-benar PRIMARY KEY
, yang diimplementasikan dengan indeks B-tree unik secara internal, dan semua kolom - cukup id
di sini - apakah NOT NULL
secara implisit. Atau setidaknya NOT NULL
. UNIQUE INDEX
tidak sepenuhnya memenuhi syarat sebagai pengganti, masih memungkinkan NULL
nilai yang tidak dianggap sama dan diperbolehkan beberapa kali. Lihat:
Selain itu, indeks tidak berguna di sini, karena semua baris harus tetap dibaca. Jadi ini tidak akan pernah menjadi sangat murah. Tapi 62 ribu baris bukan jumlah baris yang melumpuhkan dengan cara apa pun - kecuali jika Anda memiliki banyak kunci di jsonb
kolom.
Opsi yang tersisa untuk mempercepatnya:
-
Normalisasikan desain Anda. Menghapus dokumen JSON tidak bebas biaya.
-
Pertahankan tampilan yang terwujud. Kelayakan dan biaya sangat bergantung pada pola penulisan Anda.
Di situlah indeks dapat berperan lagi ...