2016-04-14 23 views
0

Satırları 120 milyon kayıt içeren tablodan silmek zorundayım. En yüksek (entry_date) ve ikinci en yüksek (entry_date) verileri silinmemelidir.Postgresql grupta milyonlarca rekoru silme

Tablonun birçok kısıtlaması var. Tek Birincil anahtar İki YABANCI anahtar ve birincil anahtar üzerindeki dizin dışındaki iki dizin.

Halihazırda temp tablosunu oluşturmak ve gerekli verileri geçici tabloya taşımak olarak kullanmayı denedim. Daha sonra mevcut tabloyu bırakıp tekrar filtrelenmiş verileri geçici olarak ana tabloya taşıyoruz. Ancak kayıtları silmede bir yoluna ihtiyacım var. İlk sadece 1 milyon verileri gibi demet rekoru nasıl silinir

CREATE TABLE values 
(
    value_id bigint NOT NULL, 
    content_definition_id bigint NOT NULL, 
    value_s text, 
    value_n double precision, 
    order integer, 
    scope_id integer NOT NULL, 
    answer boolean NOT NULL, 
    date timestamp without time zone NOT NULL, 
    entry_date timestamp without time zone NOT NULL, 
    CONSTRAINT "value_PK" PRIMARY KEY (value_id), 
    CONSTRAINT content_definition_id_fk FOREIGN KEY (content_definition_id) 
     REFERENCES content_definition (content_definition_id) MATCH SIMPLE 
     ON UPDATE NO ACTION ON DELETE NO ACTION, 
    CONSTRAINT scope_fk FOREIGN KEY (scope_id) 
     REFERENCES scopes (scope_id) MATCH SIMPLE 
     ON UPDATE RESTRICT ON DELETE RESTRICT 
) 
-- Index: fki_content_definition_id_fk 
-- Index: fki_value_value_scope_id 

silinir ve üzerinde olmalıdır.

+0

biz endeksi ve kısıtlamasını devre dışı bırakmak ve böylece herhangi bir vücut bana geçici engellilik indeksi ve Postgres'e yabancı anahtarın sözdizimi söyleyebilir misiniz that.If sonra silmeyi deneyin Can. – SUDARSHAN

+0

Tablo tanımı ve bazı örnek tablo verileri ekleyin. – jarlh

+0

tam tablo tanımı eklendi .. – SUDARSHAN

cevap

0

Bu, çakışan kilitler olmadığını varsayar. Dizin sayfası kilitlerinin de işleri yavaşlatabileceğini unutmayın.

Son PostgreSQL, bir silme deyiminde CTE kullanmanıza izin verir. Yani şunları yapabilirsiniz:

WITH ids_to_delete (
    SELECT value_id FROM values 
    where ... 
    limit ... 
) 
delete from values where value_id in (select value_id from ids_to_delete) 
+0

Geçici olarak yabancı anahtar kısıtlamasını ve silme etkinleştirildikten sonra devre dışı bırakmanın herhangi bir yolu var mı? – SUDARSHAN