我正在使用Postgres 8.4。我的系統配置是窗口7 32位4 GB RAM和2.5GHZ。ON DELETE CACADE很慢
我在Postgres有一個數據庫,有10個表t1, t2, t3, t4, t5.....t10
。
t1
有一個主鍵序列id,它是對所有其他表的外鍵引用。
的數據被插入在數據庫(即所有表中)除了t1
所有其他表具有近50000行的數據,但t1
具有一個1行,其主密鑰是從所有其他表中引用。然後我在t1中插入第二行數據,再在其他表中插入這個新引用的50,000行。
的問題是,當我想刪除存在於其他表中的所有數據項:
delete from t1 where column1='1'
這個查詢需要近10分鐘來執行。
我也創建了索引,並嘗試過,但性能沒有任何改善。 可以做些什麼?
我已經提到下面
CREATE TABLE t1
(
c1 numeric(9,0) NOT NULL,
c2 character varying(256) NOT NULL,
c3ver numeric(4,0) NOT NULL,
dmlastupdatedate timestamp with time zone NOT NULL,
CONSTRAINT t1_pkey PRIMARY KEY (c1),
CONSTRAINT t1_c1_c2_key UNIQUE (c2)
);
CREATE TABLE t2
(
c1 character varying(100),
c2 character varying(100),
c3 numeric(9,0) NOT NULL,
c4 numeric(9,0) NOT NULL,
tver numeric(4,0) NOT NULL,
dmlastupdatedate timestamp with time zone NOT NULL,
CONSTRAINT t2_pkey PRIMARY KEY (c3),
CONSTRAINT t2_fk FOREIGN KEY (c4)
REFERENCES t1 (c1) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE CASCADE,
CONSTRAINT t2_c3_c4_key UNIQUE (c3, c4)
);
CREATE INDEX t2_index ON t2 USING btree (c4);
一個示例模式讓我知道如果有什麼不對的架構。
而不考慮其他表的定義,這是不可能知道的,但它可能是由於對例如缺失索引't2(t1_id)'或任何引用字段被命名。 –
其他表與t2相同,但沒有更多列。現在我已經刪除了idexes – user2509885
「你現在已經刪除了idexes」是什麼意思?我們需要查看相關列的索引,它們是必不可少的。與所有*可能涉及的其他約束和觸發器一起。另外:您的約束名稱非常具有誤導性。當你在這裏發佈或在你的數據庫中發佈時,你是否把它們搞亂了 –