我有一個帶有組合鍵(REGION)和另一個引用該表的表(CITY)的表。插入,查詢和單個刪除操作很快。問題在於,當我嘗試使用sqlplus批量刪除CITY的內容時,從CITY中刪除它將需要永久。這個表格將有約400,000個條目,並且需要15-20分鐘才能刪除50,000條目。這裏是我使用Oracle 11的設置:Oracle複合鍵刪除速度很慢
create table COUNTRY
(
id varchar2(32) NOT NULL -- PK
...
);
create table REGION -- about 4000 entries
(
country varchar2(32) NOT NULL -- PK, FK to COUNTRY
regionCode char(2) NOT NULL -- PK
...
);
create table CITY -- about 400,000 entries
(
id number NOT NULL -- PK
country varchar2(32) NOT NULL -- FK to COUNTRY
regionCountry varchar2(32) NULL -- FK to REGION
regionCode char(2) NULL -- FK to REGION
...
);
create table LOCATION -- about 2,500,000 entries
(
id varchar2(32) NOT NULL -- PK
country varchar2(32) NOT NULL -- FK to COUNTRY
city number NULL -- FK to CITY
...
);
ALTER TABLE COUNTRY ADD CONSTRAINT PK_COUNTRY PRIMARY KEY (id) USING INDEX;
ALTER TABLE REGION ADD CONSTRAINT PK_REGION PRIMARY KEY (country, regionCode) USING INDEX;
ALTER TABLE CITY ADD CONSTRAINT PK_CITY PRIMARY KEY (id) USING INDEX;
ALTER TABLE IPGeoLoc ADD CONSTRAINT PK_LOCATION PRIMARY KEY (id) USING INDEX;
ALTER TABLE REGION ADD CONSTRAINT FK_REGION_COUNTRY
FOREIGN KEY (country) REFERENCES COUNTRY (id);
ALTER TABLE CITY ADD CONSTRAINT FK_CITY_COUNTRY
FOREIGN KEY (country) REFERENCES COUNTRY (id);
ALTER TABLE CITY ADD CONSTRAINT FK_CITY_REGION
FOREIGN KEY (regionCountry, regionCode) REFERENCES REGION (country, regionCode);
ALTER TABLE LOCATION ADD CONSTRAINT FK_LOCATION_COUNTRY
FOREIGN KEY (country) REFERENCES COUNTRY (id);
ALTER TABLE LOCATION ADD CONSTRAINT FK_LOCATION_CITY
FOREIGN KEY (city) REFERENCES CITY (id);
varchar2(32)字段是GUID。我知道我不應該使用GUID作爲PK,但我不能改變,除非我證明這是問題。
我可以從LOCATION批量刪除條目,幾秒鐘內就可以刪除300,000條條目,所以這讓我相信這是給我帶來麻煩的組合鍵。
第二個問題是我目前在CITY表中有兩個國家列 - 一個直接鏈接到COUNTRY,另一個鏈接作爲REGION組合鍵的一部分。我知道我會如何在代碼中做到這一點,只有一個國家列,但我必須使用Hibernate。除了刪除問題之外,它的工作方式是這樣的,所以我不能改變它,除非我能證明這是一個問題。我正在使用sqlplus來嘗試刪除,所以我知道Hibernate不會導致刪除問題。
你有沒有向Oracle詢問解釋計劃,看看它有什麼作用?你有'location.city'上的索引,因爲在刪除它之前,Oracle必須檢查一個城市沒有被某個位置引用。因此,由於位置表很大,如果您沒有這樣的索引,則需要花時間進行檢查。 –