2014-10-13 22 views
8

Postgresql'de büyük bir tabloya bir indeks ekledim ve yaklaşık 1 saniye sürdüm (açıkçası beni şaşırttı).Dizini neden düşürmek onu oluşturuyor?

İndeksi düşürmeye gittiğimde, dönüş yapmadan> 200 saniye çalışmasına izin verdim ve sonunda bırakma işlemini iptal ettim.

CREATE INDEX idx_cservicelocationdivisionstatus_inversed 
ON cservicelocationdivisionstatus (cservicelocationdivisionid, startdate, enddate DESC); 

çok az zaman alır, ancak

DROP INDEX idx_cservicelocationdivisionstatus_inversed; 

vazgeçtim ve iptal böylece uzun sürdü.

cservicelocationdivisionstatus tablosunda 6 sütun ve yaklaşık 310k veri satırı vardır.

Dizini kaldırmanız neden bu kadar uzun sürüyor?

DÜZENLEME: This page, mySql için, birden çok dizine sahip bir tablonun tabloyu kopyalayacağını ve tüm satırları bıraktığınız dizini olmadan yeniden ekleyeceğini belirtir. (Daha da kötüsü, mySql ile, aynı tabloda birden çok dizin bırakırsanız, tüm indeksler olmadan verileri bir kez akıllıca ve yeniden kopyalamak yerine, kaldırdığınız her dizin için tabloyu bir kez yeniden kopyalayacaktır. bırakıyor.) Postgres ile böyle bir şey oluyor mu?

+0

Dizin/tablodaki kilitleri kontrol edin: http://www.postgresql.org/docs/current/static/monitoring-locks.html Bir sorgu tarafından kullanıldığında indis bırakamazsınız. –

cevap

15

Belirtilen boyuttaki bir tablodaki bir dizin genellikle hızlı bir şekilde düşürülmelidir (ve kesinlikle 3+ dakikadan daha hızlı bir şekilde). Tablo/dizin kullanımda olduğu gibi geliyor ve bu yüzden düşürülmüş olamaz.

pg_stat_activity tablosunu sorgulayarak ve dizini oluşturduğunuz tabloyu içeren etkinliği arayarak bunu doğrulayabilirsiniz.

+0

Sorun buydu. Tabloyu kullanan uzun süren bir sorgu (> 20 dakika) vardı. Sorguyu öldürdüğümde, indeksi bırakmak için 51 ms sürdü. –

+0

Ah. 51 ms daha çok benziyor. =) – khampson

+2

DROP INDEX CONCURRENTLY, sorun için başka bir hızlı düzeltme olabilir. – kert

İlgili konular