Bunlar eşdeğer mi? Öyleyse neden olmasın?
Dizin (user_id1, user_id2) ve Dizin (user_id2, user_id1)
Bunlar eşdeğer değildir ve genel olarak konuşan endeks (bar, baz) form sorguları için etkili olmayacaktır. select * from foo where baz=?
Erwin , bu tür endekslerin gerçekten bir sorguyu hızlandırabileceğini göstermiştir , ancak bu etki sınırlıdır ve genellikle bir dizinin bir aramayı iyileştirmesini beklediğiniz sırayla aynı değildir - bir dizinin 'tam taramasının' sık sık olduğu gerçeğine dayanır. Dizinde görünmeyen fazladan sütunlar nedeniyle dizine alınmış tablonun 'tam taramasından' daha hızlıdır.
Özet: dizinler, baştaki olmayan sütunlarda bile sorgulara yardımcı olabilir, ancak iki ikincil ve göreceli olarak küçük yollardan birinde ve dramatik bir şekilde değil, normalde btree yapısı nedeniyle yardımcı olmasını beklersiniz.
nb endeksin yardımcı olabileceği iki yol, endeksin tam olarak taranması tablonun tam taramasından önemli ölçüde daha ucuzsa: 1. Tablo aramaları ucuzdur (çünkü bunlardan az sayıda vardır veya kümelenmiştir) veya 2. Endeks kaplıyor, bu yüzden bütün ayylerde masaya bakma yok , Erwins'in burada yaptığı yorumları gör
test ortamı:
create table foo(bar integer not null, baz integer not null, qux text not null);
insert into foo(bar, baz, qux)
select random()*100, random()*100, 'some random text '||g from generate_series(1,10000) g;
sorgu 1 (dizin yok, 74 arabelleğe çarpma ):
explain (buffers, analyze, verbose) select max(qux) from foo where baz=0;
QUERY PLAN
--------------------------------------------------------------------------------------------------------------
Aggregate (cost=181.41..181.42 rows=1 width=32) (actual time=3.301..3.302 rows=1 loops=1)
Output: max(qux)
Buffers: shared hit=74
-> Seq Scan on stack.foo (cost=0.00..181.30 rows=43 width=32) (actual time=0.043..3.228 rows=52 loops=1)
Output: bar, baz, qux
Filter: (foo.baz = 0)
Buffers: shared hit=74
Total runtime: 3.335 ms
sorgu 2 (indeks ile - optimizer endeksi yok sayar - tekrar 74 arabelleğe basılır):
create index bar_baz on foo(bar, baz);
explain (buffers, analyze, verbose) select max(qux) from foo where baz=0;
QUERY PLAN
--------------------------------------------------------------------------------------------------------------
Aggregate (cost=199.12..199.13 rows=1 width=32) (actual time=3.277..3.277 rows=1 loops=1)
Output: max(qux)
Buffers: shared hit=74
-> Seq Scan on stack.foo (cost=0.00..199.00 rows=50 width=32) (actual time=0.043..3.210 rows=52 loops=1)
Output: bar, baz, qux
Filter: (foo.baz = 0)
Buffers: shared hit=74
Total runtime: 3.311 ms
Query 2 (index ile - ve optimize ediciyi kullanması için kandırıyoruz):
explain (buffers, analyze, verbose) select max(qux) from foo where bar>-1000 and baz=0;
QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------
Aggregate (cost=115.56..115.57 rows=1 width=32) (actual time=1.495..1.495 rows=1 loops=1)
Output: max(qux)
Buffers: shared hit=36 read=30
-> Bitmap Heap Scan on stack.foo (cost=73.59..115.52 rows=17 width=32) (actual time=1.370..1.428 rows=52 loops=1)
Output: bar, baz, qux
Recheck Cond: ((foo.bar > (-1000)) AND (foo.baz = 0))
Buffers: shared hit=36 read=30
-> Bitmap Index Scan on bar_baz (cost=0.00..73.58 rows=17 width=0) (actual time=1.356..1.356 rows=52 loops=1)
Index Cond: ((foo.bar > (-1000)) AND (foo.baz = 0))
Buffers: shared read=30
Total runtime: 1.535 ms
Bu nedenle, dizin üzerinden erişim bu durumda iki kez daha hızlıdır, bu durumda 30 arabellek vurulur - bu, dizin oluşturma açısından 'biraz daha hızlıdır'! tablodaki verilerin
Buna karşılık, önde gelen sütundaki sorgular, dizinin btree yapısını kullanır - bu durumda 2 arabelleğe çarpma :
explain (buffers, analyze, verbose) select max(qux) from foo where bar=0;
QUERY PLAN
------------------------------------------------------------------------------------------------------------------------
Aggregate (cost=75.70..75.71 rows=1 width=32) (actual time=0.172..0.173 rows=1 loops=1)
Output: max(qux)
Buffers: shared hit=38
-> Bitmap Heap Scan on stack.foo (cost=4.64..75.57 rows=50 width=32) (actual time=0.036..0.097 rows=59 loops=1)
Output: bar, baz, qux
Recheck Cond: (foo.bar = 0)
Buffers: shared hit=38
-> Bitmap Index Scan on bar_baz (cost=0.00..4.63 rows=50 width=0) (actual time=0.024..0.024 rows=59 loops=1)
Index Cond: (foo.bar = 0)
Buffers: shared hit=2
Total runtime: 0.209 ms