Bir tabloyu verilerle doldurmadan önce mi yoksa veriler yerleştirildikten sonra bir dizin oluşturmak mı daha iyidir?


92

Değiştirmek için bir dizin ekleyerek kopyalayacağım yaklaşık 100 milyon satırlık bir tablom var. Yeni tabloyu oluşturmak için gereken süre ile çok ilgilenmiyorum, ancak herhangi bir veri eklemeden önce tabloyu değiştirirsem veya önce verileri girip ardından dizini eklersem oluşturulan dizin daha verimli olur mu?

Yanıtlar:


117

Veri girdikten sonra dizin oluşturmak daha verimli bir yoldur (hatta toplu içe aktarmadan önce ve içe aktarmadan sonra dizini yeniden oluşturduktan sonra dizinin çıkarılması önerilir).

Sözdizimsel örnek (PostgreSQL 9.1, yavaş geliştirme 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

Dizin ekleyin ve ardından dizin oluşturun - yaklaşık 12 saniye

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

Dizin oluşturun ve ardından ekleyin - yaklaşık 25,5 saniye (iki kattan fazla yavaş)


5
+1, dizinler 100 milyon satır ekleme görevini içeren bir işlemi önemli ölçüde yavaşlatır, bu nedenle onları bırakıp yeniden oluşturmak daha iyidir.
code4life

11

Dizini satırlar eklendikten sonra oluşturmak muhtemelen daha iyidir. Sadece daha hızlı olmayacak, aynı zamanda ağaç dengeleme muhtemelen daha iyi olacaktır.

Düzenleme muhtemelen "dengeleme" Burada pek iyi bir seçim değil. Bir b-ağacı durumunda, tanım gereği dengelenir. Ancak bu, b-ağacının optimum düzene sahip olduğu anlamına gelmez. Üst öğe içindeki alt düğüm dağılımı düzensiz olabilir (gelecekteki güncellemelerde daha fazla maliyete yol açar) ve güncellemeler sırasında dengeleme dikkatli bir şekilde yapılmazsa ağaç derinliği gerekenden daha derin olabilir. Dizin, satırlar eklendikten sonra oluşturulursa, muhtemelen daha iyi bir dağılıma sahip olacaktır. Ek olarak, diskteki dizin sayfalarında dizin oluşturulduktan sonra daha az parçalanma olabilir. Burada biraz daha bilgi


2

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

  1. Önce tabloya veri eklerseniz ve ardından dizin eklerseniz. Dizin oluşturma süreniz daha O(n*log(N))uzun olacaktır (burada nsatırlar eklenir). Ağaç oluşturma zamanı, O(N*log(N))o zaman bunu eski verilere ve yeni verilere bölerseniz, O((X+n)*log(N))bu basitçe dönüştürülebilir O(X*log(N) + n*log(N))ve bu formatta ek olarak ne bekleyeceğinizi kolayca görebilirsiniz.
  2. İndeks eklerseniz ve ardından verileri koyarsanız. Her satırda ( nyeni satırlarınız var) daha uzun süre elde edersiniz O(log(N)), yeni eleman ekledikten sonra ağacın yapısını yeniden oluşturmak için gereken ek süreyi ekleyin (yeni satırdan dizin sütunu, çünkü dizin zaten mevcut ve yeni satır eklendi, ardından dizin dengelenecek şekilde yeniden oluşturulmalıdır yapı, bu maliyet , bir indeks güçtür [dizin öğeleri] ). You have nihayet sahip ardından yeni satırlar ardından özeti ek süre.O(log(P))Pnn * O(log(N))O(n*log(N))

1

Sonrasında oluşturulan dizinler çoğu durumda çok daha hızlıdır. Örnek olay: satırları içe aktarırken varchar (255) - (İşletme Adı) Dizininde tam metin ile 20 milyon satır - en kötü durumlarda 20 saniyeye kadar sürecek bir eşleşme. İndeksi düşür ve yeniden oluştur - her seferinde 1 saniyeden daha kısa sürmeye karşı eşleştir


-2

Her iki durumda da dizine yeni veriler eklediğiniz için dizin verimliliği açısından gerçekten önemli olacağından emin değilim. Sunucu, temelde, bir dizinin oluşturulmasına kadar ne kadar dengesiz olacağını bilemezdi. Hız konusunda açıkçası, ekleri indeks olmadan yapın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.