Bir dizin ekleyerek, değiştirmek için kopyalayacağım yaklaşık 100M satırlık bir tablo var. Yeni tabloyu oluşturmak için gereken zamanla ilgilenmiyorum, ancak herhangi bir veri eklemeden önce tabloyu değiştirdiğimde veya önce verileri ekledikten sonra dizini eklediğimde oluşturulan dizin daha verimli olacak mı?Veri içeren bir tabloyu doldurmadan önce veya veriler yerdeyken bir dizin oluşturmak daha iyi midir?
Veri içeren bir tabloyu doldurmadan önce veya veriler yerdeyken bir dizin oluşturmak daha iyi midir?
cevap
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ş)
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
Bu sorun önemli değil çünkü:
- 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üzdeO((X+n)*log(N))
elde edersiniz, bu sadeceO(X*log(N) + n*log(N))
'a dönüştürülebilir ve bu formatta ek olarak ne bekleyeceğinizi görebilirsiniz. - dizini eklerseniz ve veri koymak sonra. Her satır (
n
yeni satırınız var) eklediğiniz zaman daha fazla ekO(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ırP
bir göstergesi güç [dizin öğeleri]) olduğu, dengeli yapıya buO(log(P))
maliyet. Sonunda nen * O(log(N))
sonraO(n*log(N))
özeti ek zaman var daha sonran
yeni satırlar var.
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.
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
+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