Saya memiliki definisi tabel dan indeks berikut:
CREATE TABLE munkalap (
munkalap_id serial PRIMARY KEY,
...
);
CREATE TABLE munkalap_lepes (
munkalap_lepes_id serial PRIMARY KEY,
munkalap_id integer REFERENCES munkalap (munkalap_id),
...
);
CREATE INDEX idx_munkalap_lepes_munkalap_id ON munkalap_lepes (munkalap_id);
Mengapa tidak ada indeks pada munkalap_id yang digunakan dalam kueri berikut?
EXPLAIN ANALYZE SELECT ml.* FROM munkalap m JOIN munkalap_lepes ml USING (munkalap_id);
QUERY PLAN
Hash Join (cost=119.17..2050.88 rows=38046 width=214) (actual time=0.824..18.011 rows=38046 loops=1)
Hash Cond: (ml.munkalap_id = m.munkalap_id)
-> Seq Scan on munkalap_lepes ml (cost=0.00..1313.46 rows=38046 width=214) (actual time=0.005..4.574 rows=38046 loops=1)
-> Hash (cost=78.52..78.52 rows=3252 width=4) (actual time=0.810..0.810 rows=3253 loops=1)
Buckets: 1024 Batches: 1 Memory Usage: 115kB
-> Seq Scan on munkalap m (cost=0.00..78.52 rows=3252 width=4) (actual time=0.003..0.398 rows=3253 loops=1)
Total runtime: 19.786 ms
Itu sama bahkan jika saya menambahkan filter:
EXPLAIN ANALYZE SELECT ml.* FROM munkalap m JOIN munkalap_lepes ml USING (munkalap_id) WHERE NOT lezarva;
QUERY PLAN
Hash Join (cost=79.60..1545.79 rows=1006 width=214) (actual time=0.616..10.824 rows=964 loops=1)
Hash Cond: (ml.munkalap_id = m.munkalap_id)
-> Seq Scan on munkalap_lepes ml (cost=0.00..1313.46 rows=38046 width=214) (actual time=0.007..5.061 rows=38046 loops=1)
-> Hash (cost=78.52..78.52 rows=86 width=4) (actual time=0.587..0.587 rows=87 loops=1)
Buckets: 1024 Batches: 1 Memory Usage: 4kB
-> Seq Scan on munkalap m (cost=0.00..78.52 rows=86 width=4) (actual time=0.014..0.560 rows=87 loops=1)
Filter: (NOT lezarva)
Total runtime: 10.911 ms
HeapTupleHeader
(23 byte per baris) + NULL bitmask + alignment sesuai dengan MAXALIGN. Akhirnya, jumlah padding yang tidak diketahui karena penyelarasan data tergantung pada tipe data kolom dan urutannya. Secara keseluruhan tidak ada lebih dari 33 baris pada halaman 8 kb dalam hal ini. (Tidak memperhitungkan TOAST.)EXPLAIN ANALYZE SELECT foo from bar
dengan tabel dummy dasar untuk memverifikasi. Juga, ruang disk sebenarnya tergantung pada penyelarasan data, yang akan sulit untuk diperhitungkan ketika hanya beberapa baris yang diambil. Lebar baris dalamEXPLAIN
mewakili persyaratan ruang dasar untuk set kolom yang diambil.Anda mengambil semua baris dari kedua tabel, sehingga tidak ada manfaat nyata dengan menggunakan pemindaian indeks. Pemindaian indeks hanya masuk akal jika Anda memilih hanya beberapa baris dari sebuah tabel (biasanya kurang dari 10% -15%)
sumber
(lezarva, munkalap_id)
dan cukup selektif, maka dapat digunakan. ItuNOT
membuat itu kurang mungkin.