2010-09-10 6 views

cevap

70

oluşturma endeksi (hatta çoğu kez toplu ithalat öncesi ve ithalat yeniden oluşturun sonra dizini düşmesi tavsiye edilir) daha verimli bir yoldur.

Sentetik örneği (PostgreSQL 9.1, yavaş gelişim makinesi, bir milyon satır):

CREATE TABLE test1(id serial, x integer); 
INSERT INTO test1(id, x) SELECT x.id, x.id*100 FROM generate_series(1,1000000) AS x(id); 
-- Time: 7816.561 ms 
CREATE INDEX test1_x ON test1 (x); 
-- Time: 4183.614 ms 

takın ve ardından dizin oluşturmak - yaklaşık 12 sn

CREATE TABLE test2(id serial, x integer); 
CREATE INDEX test2_x ON test2 (x); 
-- Time: 2.315 ms 
INSERT INTO test2(id, x) SELECT x.id, x.id*100 FROM generate_series(1,1000000) AS x(id); 
-- Time: 25399.460 ms 

eklemek sonra dizin oluşturma ve - yaklaşık 25,5 sn (iki kereden daha yavaş)

+3

+1, dizinler 100M satır ekleme görevini içeren bir işlemi yavaşlatır, böylece onları düşürüp yeniden oluşturur. – code4life

7

satırlar eklendikten sonra dizin oluşturmak için muhtemelen daha iyidir. Sadece daha hızlı değil, ağaç dengelemesi muhtemelen daha iyi olacak.

Düzenleme "Dengeleme" muhtemelen burada en iyi seçenek değildir. Bir b-ağacı durumunda, tanım gereği dengelenir. Ancak bu, b-ağacının en uygun yerleşime sahip olduğu anlamına gelmez. Ebeveynler içindeki çocuk düğümü dağılımı dengesiz olabilir (gelecekteki güncellemelerde daha fazla maliyete yol açar) ve güncellemeler sırasında dengelemenin dikkatli bir şekilde yapılmaması durumunda ağaç derinliği gerekenden daha derine inebilir. Satırlar eklendikten sonra dizin oluşturulursa, daha iyi bir dağıtım olması daha olasıdır. Ayrıca, dizin oluşturulduktan sonra diskteki dizin sayfaları daha az parçalara ayrılabilir. veri ekleme sonra A bit more information here

1

Bu sorun önemli değil çünkü:

  1. Tabloda ilk verilerini eklerseniz ve ondan sonra dizini ekleyin. Endeks oluşturma süreniz O(n*log(N)) uzun olacaktır (n satır eklenmiştir). Ağaç gevezelik zamanı O(N*log(N)) olduğundan, bu verileri eski verilere ve yeni verilere böldüğünüzde O((X+n)*log(N)) elde edersiniz, bu sadece O(X*log(N) + n*log(N))'a dönüştürülebilir ve bu formatta ek olarak ne bekleyeceğinizi görebilirsiniz.
  2. dizini eklerseniz ve veri koymak sonra. Her satır (n yeni satırınız var) eklediğiniz zaman daha fazla ek O(log(N)) yeni eleman ekledikten sonra ağacın yapısını yeniden oluşturmak için gerekli (yeni satırdan indeks sütunu, çünkü dizin zaten var ve yeni satır eklendi, sonra dizin yeniden oluşturulmalıdır P bir göstergesi güç [dizin öğeleri]) olduğu, dengeli yapıya bu O(log(P)) maliyet. Sonunda ne n * O(log(N)) sonra O(n*log(N)) özeti ek zaman var daha sonra n yeni satırlar var.
-1

Her iki durumda da dizine yeni veriler eklediğiniz için, dizin verimliliği açısından gerçekten önemli olduğuna emin değilim. Sunucu, bir indeksin temelde oluşturulduktan sonra ne kadar dengesiz olacağını bilmezdi. Hız bilge, açıkça, endekssiz ekler ekler.

0

Oluşturulan dizinler, çoğu durumda çok daha hızlıdır. Durumda durum: varcharda tam metin bulunan 20 milyon satır (255) - (İş Unvanı) Satırları içe aktarırken, yerinde indeks - en kötü durumlarda 20 saniyeye kadar çıkma. Dizini bırak ve yeniden oluştur - her zaman 1 saniyeden az sürmeye karşı eşleşme