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. Android: Daha iyi bir uygulama, global bir dize veya fazladan veriler içeren hedefler kullanıyor?
- 2. Pandalarda iki dizin içeren bir veri çerçevesi
- 3. Başka bir veri çerçevesinden dizin içeren boş bir veri çerçevesi oluşturun
- 4. HTTPS ... Çözüm veya daha iyi bir yol?
- 5. BlackBerry'de Bitmap veya EncodedImage kullanmak daha iyi midir?
- 6. Değerini C++ olarak ayarlamadan önce bir değişkeni kontrol etmek daha iyi midir?
- 7. Bir veya daha fazla kapsayıcı içeren bir docker kabı oluşturmak mümkün mü?
- 8. Yapısal Mülkiyet veya daha iyi bir yolu?
- 9. Bir dersi kullanmak veya uzatmak daha mı iyi? (hızlı)
- 10. Kısa talimatlar daha iyi performansa sahip midir?
- 11. Bir süreliğine IDE kullanmamak iyi midir?
- 12. Global olarak bölümlenmiş bir dizin bölümlenmemiş bir dizinden daha iyi (daha hızlı) mı?
- 13. İşlev tabanlı bir dizin için daha iyi performans: NVL2 veya DECODE?
- 14. Belge hazır olmadan önce çerez oluşturmak güvenli midir?
- 15. Veri noktalarından (veya CDF'leri çizmek için daha iyi bir yol?) [Matplotlib veya genel çizim yardımı]
- 16. array_push() öğesi içinde bir dizi eleman oluşturmak kadar etkili midir?
- 17. Uygulamamda manuel olarak kılavuz oluşturmak veya sql server/azure sql'nin benim için oluşturmasını sağlamak daha iyi midir
- 18. Bir if ifadesinde bir değişkenin varlığını kontrol etmek veya bir koruma bildirimi kullanmak daha iyi bir stil midir?
- 19. daha iyi bir yol?
- 20. Android'de birden çok SpanObject veya birden çok TextView kullanmak daha iyi midir?
- 21. "ab" veya "httperf" daha iyi?
- 22. Daha iyi bir php array_merge
- 23. Android Uygulamasını test etmek için AVD veya USB hata ayıklama kullanmak daha iyi midir?
- 24. writeFile böyle bir dosya veya dizin yok
- 25. Android: Veri tabanı girişini eklemek ve/veya güncellemek için daha iyi bir yol var mı?
- 26. Daha iyi bir yöntem, daha hızlı bir şekilde sorgulamak için daha iyi bir yoldur.
- 27. Codecampserver'da StaticFactory iyi bilinen bir model midir?
- 28. Başka bir alanda bir sayıya eşit veya daha az sayı içeren bir açılır kutu oluşturma
- 29. Daha iyi bir PHP/MySQL fotoğraf galerisi veya ASP.NET/C# fotoğraf galerisi hangileri daha iyi olacak?
- 30. JS/jQuery - Olay işleyicisini $ (document) .ready veya daha önce çağrılan işlevde daha iyi çalıştır
+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