Ben senin DB yapmak için hiçbir neden WHERE yan tümcesi değerlendirilmesi ekstra çalışma gerçekten orada yapmak olduğunu iddia ediyorum. Eğer actually tüm kayıtları istiyorum göz önüne alındığında, bunları getiriliyor işi yapmak zorunda kalacaktır. Eğer tablodan tek bir SELECT yaparsanız, bu tablo-sırayla hepsini almak ve bunları kendiniz bölümlemek. NEREYE erkek SELECT ve WHERE kadın seçerseniz, her operasyon için bir dizin vurmak gerekir, ve bazı veri yerellik kaybedersiniz.
Diskteki kayıtlar erkek-dişi alternatif ve bellek çok daha büyük bir veri kümesi varsa, her ikisi için de tek bir SELECT bir olacaktır oysa Örneğin, büyük olasılıkla, iki ayrı sorgu yaparsanız iki kez tüm veritabanını okumak gerekir Tek tablo taraması.
EDIT:
Since I'm getting downmodded into oblivion, I decided to actually run the test.
I've generated a table
GEÇİCİ TABLO gender_test (some_data ÇİFT HASSAS, cinsiyet KARAKTER DEĞİŞEN (20)) CREATE;
Ben bazı rasgele veri oluşturulur,
select gender, count(*) from gender_test group by gender;
gender | count
--------+----------
female | 12603133
male | 10465539
(2 rows)
İlk olarak, ben iyiyim eminim bu durumda, en endekslerin olmadan bu testleri çalıştırmak izin ...
test=> EXPLAIN ANALYSE SELECT * FROM gender_test WHERE gender='male';
QUERY PLAN
Seq Scan on gender_test (cost=0.00..468402.00 rows=96519 width=66) (actual time=0.030..4595.367
rows=10465539 loops=1)
Filter:
((gender)::text = 'male'::text)
Total runtime: 5150.263 ms
test=> EXPLAIN ANALYSE SELECT * FROM gender_test WHERE gender='female';
QUERY PLAN
Seq Scan on gender_test
(cost=0.00..468402.00 rows=96519 width=66) (actual time=0.029..4751.219 rows=12603133 loops=1)
Filter: ((gender)::text = 'female'::text)
Total runtime: 5418.891 ms
test=> EXPLAIN ANALYSE SELECT * FROM gender_test;
QUERY PLAN
Seq Scan on gender_test
(cost=0.00..420142.40 rows=19303840 width=66) (actual time=0.021..3326.164 rows=23068672 loops=1)
Total runtime: 4543.393 ms (2 rows)
Komik, gerçekten hızlı filtre olmadan bir tablo tarama verilerini edilir getiriliyor gibi görünüyor! Aslında, daha hızlı olarak iki kat daha! Ben tahmin Çok gibi (+ 5418> 4543 5150)! :-P
Şimdi, bir dizin yapalım ve sonuçlarını değiştirir görmek ...
Gender_test (cinsiyet) ON INDEX test_index CREATE;
Şimdi aynı sorguları yeniden çalıştırmanız ...
test=> EXPLAIN ANALYSE SELECT FROM gender_test WHERE gender='male';
QUERY PLAN
Bitmap Heap Scan on gender_test
(cost=2164.69..195922.27 rows=115343 width=66) (actual time=2008.877..4388.348 rows=10465539 loops=1)
Recheck Cond:
((gender)::text = 'male'::text)
->
Bitmap Index Scan on test_index (cost=0.00..2135.85 rows=115343 width=0) (actual time=2006.047..2006.047 rows=10465539 loops=1)
Index Cond: ((gender)::text = 'male'::text)
Total runtime: 4941.64 ms
test=> EXPLAIN ANALYSE SELECT * FROM gender_test WHERE gender='female';
QUERY PLAN
Bitmap Heap Scan on gender_test (cost=2164.69..195922.27 rows=115343 width=66) (actual time=1915.385..4269.933 rows=12603133 loops=1)
Recheck Cond: ((gender)::text = 'female'::text)
-> Bitmap Index Scan on test_index (cost=0.00..2135.85 rows=115343 width=0) (actual time=1912.587..1912.587 rows=12603133 loops=1)
Index Cond: ((gender)::text = 'female'::text)
Total runtime:
4931.555 ms (5 rows)
test=> EXPLAIN ANALYSE SELECT * FROM gender_test;
QUERY PLAN
Seq Scan on gender_test (cost=0.00..457790.72 rows=23068672 width=66) (actual time=0.021..3304.836 rows=23068672 loops=1)
Total runtime: 4523.754 ms
Komik .... tek seferde tüm tabloyu tarayarak hala twice as fast! (4523 vs + 4931 4941)
NOTE bu bilimdışı yolları her türlü var. Ben 16GB RAM ile çalıştırıyorum, yani tüm veri kümesi belleğe sığar. Postgres neredeyse o kadar kullanmak üzere yapılandırılmış, ancak disk önbelleği hala diski vurdu bir kez etkiler sadece kötü olsun ki ... Ben varsayımında istiyorum yardımcı olur (ama aslında denemek için assed olamaz) değildir. Ben sadece Postgres indeksleme btree varsayılan çalıştı. Ben PHP bölümleme hiçbir zaman alır varsayarak kulüpler - doğru değil, ama muhtemelen oldukça makul bir yaklaşım.
Tüm testler Mac Pro 8-yönlü 2.66 Xeon 16GB RAID-0 7200 çalıştırmak
Ayrıca, bu veri kümesi çoğu insanın umurunda muhtemelen daha biraz daha büyük olan 26 milyon satır, bir ...
Açıkçası, ham hızı umurumda tek şey değil. (En?) Birçok uygulamada, onları ayrı ayrı getiriliyor mantıksal "doğruluğu" hakkında daha fazla önem ediyorum. "Biz daha hızlı gitmek için bu gerekiyor" diyerek patronuna aşağı gelince, bu (görünüşte) bir 2x hıza verecektir. OP açıkça verimliliği hakkında sordu. Mutlu?