SDE表空間過(guò)大分析(STATES,STATE_LINEAGES表過(guò)大)
一、環(huán)境
ArcGIS10.1 Oracle11G
二、問(wèn)題描述
在進(jìn)行數(shù)據(jù)庫(kù)巡檢時(shí)候,發(fā)現(xiàn)SDE表空間占用較大(超過(guò)40GB),因我們使用的時(shí)候SDE表空間沒(méi)有存儲(chǔ)任何用戶(hù)數(shù)據(jù),只有SDE系統(tǒng)表,數(shù)據(jù)量這么大有些不正常。
三、問(wèn)題分析
1、檢查空間占用情況
SELECT * FROM (SELECT SEGMENT_NAME, SEGMENT_TYPE, ROUND (SUM(BYTES) / 1024 / 1024 ,0) SEGMENT_SIZE FROM (SELECT T.TABLESPACE_NAME, T.SEGMENT_NAME, T.SEGMENT_TYPE, T.BYTES FROM USER_SEGMENTS T WHERE 1 = 1 AND T.SEGMENT_TYPE NOT IN ('INDEX', 'LOBINDEX', 'LOBSEGMENT') UNION ALL SELECT T.TABLESPACE_NAME, UL.TABLE_NAME AS SEGMENT_NAME, 'TABLE' AS SEGMENT_TYPE, T.BYTES FROM USER_SEGMENTS T INNER JOIN USER_LOBS UL ON T.SEGMENT_NAME = UL.SEGMENT_NAME WHERE 1 = 1 AND T.SEGMENT_TYPE = 'LOBSEGMENT' UNION ALL SELECT T.TABLESPACE_NAME, UI.TABLE_NAME AS SEGMENT_NAME, 'TABLE' AS SEGMENT_TYPE, T.BYTES FROM USER_SEGMENTS T INNER JOIN USER_INDEXES UI ON T.SEGMENT_NAME = UI.INDEX_NAME WHERE 1 = 1 AND T.SEGMENT_TYPE IN ('INDEX', 'LOBINDEX') AND 1 = 1) T WHERE 1 = 1 GROUP BY SEGMENT_NAME, SEGMENT_TYPE) T WHERE 1 = 1 ORDER BY SEGMENT_SIZE DESC;
可以看到占用較大的是STATE_LINEAGES表,采用SQL語(yǔ)句查看其數(shù)據(jù)條數(shù),發(fā)現(xiàn)數(shù)據(jù)量到達(dá)8億多條,這明顯是不正常的。
注意:當(dāng)時(shí)還發(fā)現(xiàn)部分索引占用空間較大,對(duì)索引進(jìn)行重建即可。
select t.TABLE_NAME,t.NUM_ROWS from user_tables t where t.NUM_ROWS is not null order by t.NUM_ROWS desc;
2、對(duì)STATE_LINEAGES表進(jìn)行分析
經(jīng)過(guò)查閱相關(guān)資料,STATE_LINEAGES表和STATES表主要是負(fù)責(zé)記錄版本編輯的信息(對(duì)于版本編輯不熟悉的可以參見(jiàn)一下ArcGIS官方文檔,其主要是注冊(cè)版本后可以多人同時(shí)在線編輯)。
版本編輯參考:
ArcSDE的版本管理機(jī)制_51CTO博客_arcgis版本管理
ArcGIS Help 10.1 - Versioned tables in a geodatabase in SQL Server
但是我們這邊沒(méi)有用到版本,我的庫(kù)里面也沒(méi)有注冊(cè)任何版本,為了避免遺漏,咨詢(xún)公司DBA通過(guò)SQL進(jìn)行查詢(xún):
select owner,table_name from table_registry where bitand(object_flags,power(2,3))>0;
查詢(xún)結(jié)果后發(fā)現(xiàn),只有個(gè)別圖層注冊(cè)了版本,經(jīng)過(guò)檢查,這幾個(gè)圖層所在的表空間已經(jīng)刪除,此些記錄也只是遺留下來(lái)的臟數(shù)據(jù)而已,這樣可以確定沒(méi)有注冊(cè)版本的圖層。
3、對(duì)STATE_LINEAGES表內(nèi)數(shù)據(jù)進(jìn)行分析
select t.owner,count(*) from states t group by t.owner order by count(*) desc;
發(fā)現(xiàn)記錄均集中在特定的幾個(gè)用戶(hù)之中,根據(jù)業(yè)務(wù)分析,這幾個(gè)用戶(hù)都是涉及到數(shù)據(jù)上圖的用戶(hù);
說(shuō)明:我們這里對(duì)數(shù)據(jù)的處理都是通過(guò)SOE擴(kuò)展地圖服務(wù)功能實(shí)現(xiàn)數(shù)據(jù)增刪改的,一般只是涉及增加和刪除操作。
4、系統(tǒng)以及表清空測(cè)試(測(cè)試環(huán)境)
根據(jù)DBA描述,如果沒(méi)有用到版本編輯,相應(yīng)的表是可以清空的,我這里進(jìn)行相關(guān)測(cè)試
A、通過(guò)系統(tǒng)上圖功能測(cè)試,每次點(diǎn)擊保存界址點(diǎn)的時(shí)候是會(huì)對(duì)數(shù)據(jù)進(jìn)行刪除后再新增(邏輯明顯有問(wèn)題,應(yīng)該只有界址點(diǎn)發(fā)生改變時(shí)才觸發(fā)此操作,測(cè)試),在STATE_LINEAGES表中會(huì)新增記錄;
B、清空STATE_LINEAGES表(注意表有相關(guān)聯(lián)的索引、主鍵等,為了不破壞相應(yīng)的關(guān)系,建議原表備份刪除后進(jìn)行重建)
我這里因測(cè)試環(huán)境數(shù)據(jù)量比較小(注意,這僅僅適用于數(shù)據(jù)量不大的情況),采用下面語(yǔ)句進(jìn)行表備份清空:
CREATE TABLE STATES_1 AS SELECT * FROM STATES; CREATE TABLE STATE_LINEAGES_1 AS SELECT * FROM STATE_LINEAGES;
DELETE FROM STATES; DELETE FROM STATE_LINEAGES;
如果要恢復(fù)數(shù)據(jù),只要通過(guò)之前備份的語(yǔ)句重建表之后,將記錄插回去即可。
INSERT INTO STATES SELECT * FROM STATES_1; INSERT INTO STATE_LINEAGES SELECT * FROM STATE_LINEAGES_1;
在系統(tǒng)中點(diǎn)擊保存時(shí)候會(huì)報(bào)錯(cuò),通過(guò)跟蹤ArcGIS Server日志,錯(cuò)誤信息如下:
【DeleteData】:刪除失敗.錯(cuò)誤消息:Underlying DBMS error [Error executing stored procedure sde.version_util.insert_state::ORA-06508: PL/SQL: 無(wú)法找到正在調(diào)用 的程序單元] [SDE.DEFAULT][STATE_ID = 15677]
5、SOE檢查,原因明確
通過(guò)上免的測(cè)試可以發(fā)現(xiàn),基本就是通過(guò)SOE進(jìn)行數(shù)據(jù)刪除的方法有問(wèn)題了,讓開(kāi)發(fā)檢查相關(guān)語(yǔ)句,是否有版本編輯相關(guān)的內(nèi)容,結(jié)果發(fā)現(xiàn)在做編輯的時(shí)候使用了以下語(yǔ)句:
muWorkspaceEdit.StartMultiuserEditing(esriMultiuserEditSessionMode.esriMESMVersioned);
這明顯是使用了基于版本的方法,修改成下面的方法并重新編譯SOE
muWorkspaceEdit.StartMultiuserEditing(esriMultiuserEditSessionMode.esriMESMNonVersioned);
四、問(wèn)題解決與后續(xù)跟蹤
SOE修改編譯后,將現(xiàn)場(chǎng)地圖服務(wù)所使用的SOE進(jìn)行全部替換(如果有多個(gè)站點(diǎn)使用了此SOE,不要有遺漏);
在后續(xù)跟蹤STATE_LINEAGES表中數(shù)據(jù)產(chǎn)生情況
select to_char(t.creation_time,'yyyymmdd'),count(*) from STATES t group by to_char(t.creation_time,'yyyymmdd') order by to_char(t.creation_time,'yyyymmdd') desc;
select to_char(t.creation_time,'yyyymmdd'),t.owner,count(*) from STATES t group by t.owner,to_char(t.creation_time,'yyyymmdd') order by to_char(t.creation_time,'yyyymmdd') desc;
經(jīng)過(guò)跟蹤測(cè)試,后續(xù)的上圖以及數(shù)據(jù)刪除等不會(huì)再在STATE_LINEAGES表中差生新的記錄。
在測(cè)試環(huán)境下清空STATE_LINEAGES表之后,刪除以及上圖也不會(huì)再有錯(cuò)誤,同步使用ArcGIS進(jìn)行數(shù)據(jù)編輯、版本注冊(cè)等操作,驗(yàn)證也沒(méi)有任何問(wèn)題,數(shù)據(jù)表增長(zhǎng)的情況得以解決!
至于現(xiàn)在已有的存量數(shù)據(jù),可以考慮備份后情況或者記錄保留均可以,只要后續(xù)不再增長(zhǎng),問(wèn)題不大!
最后附上兩個(gè)表的建表語(yǔ)句
-- Create table create table STATE_LINEAGES ( lineage_name INTEGER not null, lineage_id INTEGER not null ) tablespace SDE_TBS pctfree 5 initrans 4 maxtrans 255 storage ( initial 7M next 1M minextents 1 maxextents unlimited ); -- Create/Recreate indexes create index LINEAGE_ID_IDX2 on STATE_LINEAGES (LINEAGE_ID) tablespace SDE_TBS pctfree 5 initrans 4 maxtrans 255 storage ( initial 10M next 4M minextents 1 maxextents unlimited ); -- Create/Recreate primary, unique and foreign key constraints alter table STATE_LINEAGES add constraint LINEAGES_PK primary key (LINEAGE_NAME, LINEAGE_ID) using index tablespace SDE_TBS pctfree 10 initrans 2 maxtrans 255 storage ( initial 64K next 1M minextents 1 maxextents unlimited ); -- Grant/Revoke object privileges grant select on STATE_LINEAGES to PUBLIC; -- STATES表的相關(guān)語(yǔ)句 -- Create table create table STATES ( state_id INTEGER not null, owner NVARCHAR2(32) not null, creation_time DATE not null, closing_time DATE, parent_state_id INTEGER not null, lineage_name INTEGER not null ) tablespace SDE_TBS pctfree 10 initrans 4 maxtrans 255 storage ( initial 1M next 128K minextents 1 maxextents unlimited ); -- Create/Recreate primary, unique and foreign key constraints alter table STATES add constraint STATES_PK primary key (STATE_ID) using index tablespace SDE_TBS pctfree 10 initrans 5 maxtrans 255 storage ( initial 320K next 128K minextents 1 maxextents unlimited ); alter table STATES add constraint STATES_CUK unique (PARENT_STATE_ID, LINEAGE_NAME) using index tablespace SDE_TBS pctfree 10 initrans 5 maxtrans 255 storage ( initial 384K next 128K minextents 1 maxextents unlimited ); -- Grant/Revoke object privileges grant select on STATES to PUBLIC;
posted on 2025-10-23 15:10 jingkunliu 閱讀(7) 評(píng)論(0) 收藏 舉報(bào)






浙公網(wǎng)安備 33010602011771號(hào)