對於特殊字段,比如外鍵,主鍵,在不知道外鍵主鍵名的情況下,需要如下操作
select constrname from sysconstraints where constrtype='R' and tabid= ( select tabid from systables where tabname = 'tst_1' ) ; ----'R'查找外鍵,'P'查找主鍵
------針對informix數據庫-----------------------------------------------------------
ALTER TABLE yourtable DROP CONSTRAINT constrname;
yourtable :你要刪除的約束所在的表名稱;
constrname :你要刪除的約束名稱;
constrname的獲得:
在informix數據庫中有一個系統表:sysconstraints
該表中存儲了數據庫所有的約束的基本信息:
constrid :約束標示
constrname :約束名稱
owner :owner的用戶名稱
tabid :表標示
constrtype :約束類型
取值:C(check constraint)、P(Primary key)、R(Referential)、U(Unique)、N(Not Null)其中R則是你所需要的。
idxname :索引名稱
根據tabid從另一個系統表systables中檢索tabname。
希望對你有幫助。
select constrname from sysconstraints where constrtype='R' and tabid= ( select tabid from systables where tabname = 'tst_1' ) ; ----'R'查找外鍵,'P'查找主鍵
------針對informix數據庫-----------------------------------------------------------
ALTER TABLE yourtable DROP CONSTRAINT constrname;
yourtable :你要刪除的約束所在的表名稱;
constrname :你要刪除的約束名稱;
constrname的獲得:
在informix數據庫中有一個系統表:sysconstraints
該表中存儲了數據庫所有的約束的基本信息:
constrid :約束標示
constrname :約束名稱
owner :owner的用戶名稱
tabid :表標示
constrtype :約束類型
取值:C(check constraint)、P(Primary key)、R(Referential)、U(Unique)、N(Not Null)其中R則是你所需要的。
idxname :索引名稱
根據tabid從另一個系統表systables中檢索tabname。
希望對你有幫助。
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
對於特殊字段,比如外鍵,主鍵,在不知道外鍵主鍵名的情況下,需要如下操作
select constrname from sysconstraints where constrtype='R' and tabid= ( select tabid from systables where tabname = 'tst_1' ) ; ----'R'查找外鍵,'P'查找主鍵
------針對informix數據庫-----------------------------------------------------------
ALTER TABLE yourtable DROP CONSTRAINT constrname;
yourtable :你要刪除的約束所在的表名稱;
constrname :你要刪除的約束名稱;
constrname的獲得:
在informix數據庫中有一個系統表:sysconstraints
該表中存儲了數據庫所有的約束的基本信息:
constrid :約束標示
constrname :約束名稱
owner wner的用戶名稱
tabid :表標示
constrtype :約束類型
取值:C(check constraint)、P(Primary key)、R(Referential)、U(Unique)、N(Not Null)其中R則是你所需要的。
idxname :索引名稱
根據tabid從另一個系統表systables中檢索tabname
select constrname from sysconstraints where constrtype='R' and tabid= ( select tabid from systables where tabname = 'tst_1' ) ; ----'R'查找外鍵,'P'查找主鍵
------針對informix數據庫-----------------------------------------------------------
ALTER TABLE yourtable DROP CONSTRAINT constrname;
yourtable :你要刪除的約束所在的表名稱;
constrname :你要刪除的約束名稱;
constrname的獲得:
在informix數據庫中有一個系統表:sysconstraints
該表中存儲了數據庫所有的約束的基本信息:
constrid :約束標示
constrname :約束名稱
owner wner的用戶名稱
tabid :表標示
constrtype :約束類型
取值:C(check constraint)、P(Primary key)、R(Referential)、U(Unique)、N(Not Null)其中R則是你所需要的。
idxname :索引名稱
根據tabid從另一個系統表systables中檢索tabname
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
--查看索引定義
select dbms_metadata.get_ddl('INDEX','IDX_PG_HY_YDNSRXX_PGFAXH') from dual;
--在某個用戶下找所有的索引
select user_indexes.table_name, user_indexes.index_name,uniqueness, column_name
from user_ind_columns, user_indexes
where user_ind_columns.index_name = user_indexes.index_name
and user_ind_columns.table_name = user_indexes.table_name
order by user_indexes.table_type, user_indexes.table_name,
user_indexes.index_name, column_position;
--查看索引
select INDEX_NAME,table_name ,COLUMN_NAME,INDEX_OWNER from dba_ind_columns where TABLE_NAME='PG_HY_YDNSRXX';
--查找所有索引
select * from all_indexes;
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
討論這個之前;需要跟大家提到一個概念-“主鍵”;其實主鍵是一種特殊的唯一索引;當建立一個主鍵是;在系統中其實建立了一個不能為空的唯一索引。他和唯一索引的區別也就是不能為空這么一點了。因此他能做到唯一識別表中的一條記錄的作用。索引都有索引名在create index idx-name中定義;主鍵在定義是沒有指定名稱;但實際上系統會給自動命名一個unnn_nnn【n為數字】的一個名字。可以通過如下語句查得:【如查basetab_pps主鍵名字】
select constrname from sysconstraints
where tabid in (select tabid from systables where tabname='basetab_pps');
下面可以談談如何恢復損壞得索引了:
1、 如果是普通得索引。這樣就相對得簡單了;刪除並重建他就可以了。
drop index idx-name;
create index idx-name on tabname(colname1,colname2…);
2、 如果是主鍵損壞;同樣可以刪除並重建他。
A、 刪除主鍵
select constrname from sysconstraints
where tabid in (select tabid from systables where tabname='tabname');
alter table tabname drop constraint cons_name;
B、 重建主鍵
alter table basetab_pps add constraint primary key (colname1,colname2…);
3、如果重建都有問題;那么最后一招;只有將表重建了。導出數據和建表語句;刪除表、重建表、重建索引。。。
關於索引的問題最后討論一下;統計更新【upadte statistics】的作用
舉個簡單的例子:
試驗一:
在dbaccess 中執行如下操作:
drop table t1
create table t1 (c1 int,c2 char(10));
create index i_t1 on t1 (c1);
insert into t1 values (1,1);
insert into t1 values (2,1);
insert into t1 values (3,1);
set explain on --
select * from t1 where c1 = 2;
在運行目錄下的sqexplain.out文件中看到:
QUERY:
------
select * from t1 where c1 = 2
Estimated Cost: 2
Estimated # of Rows Returned: 2
1) smpmml.t1: SEQUENTIAL SCAN
Filters: smpmml.t1.c1 = 2
試驗二:
在dbaccess 中執行如下操作:
drop table t1
create table t1 (c1 int,c2 char(10));
create index i_t1 on t1 (c1);
insert into t1 values (1,1);
insert into t1 values (2,1);
insert into t1 values (3,1);
update statistics for table t1;
set explain on
select * from t1 where c1 = 2;
在運行目錄下的sqexplain.out文件中看到:
QUERY:
------
select * from t1 where c1 = 2
Estimated Cost: 1
Estimated # of Rows Returned: 1
1) smpmml.t1: INDEX PATH
(1) Index Keys: c1
Lower Index Filter: smpmml.t1.c1 = 2
試驗三:
在dbaccess 中執行如下操作:
drop table t1
create table t1 (c1 int,c2 char(10));
create unique index i_t1 on t1 (c1);
insert into t1 values (1,1);
insert into t1 values (2,1);
insert into t1 values (3,1);
set explain on
select * from t1 where c1 = 2;
在運行目錄下的sqexplain.out文件中看到:
QUERY:
------
select * from t1 where c1 = 2
Estimated Cost: 2
Estimated # of Rows Returned: 1
1) smpmml.t1: INDEX PATH
(1) Index Keys: c1
Lower Index Filter: smpmml.t1.c1 = 2
分析一下:
試驗一:建立了一般的索引;對按索引字段進行搜索;但是沒有用到剛建立起來的索引。按全表掃描SEQUENTIAL SCAN進行查找。
試驗二:建立了一般的索引;並且進行了統計更新后;對按索引字段進行搜索;使用到建立起來的索引。INDEX PATH
試驗三:建立了唯一索引;對按索引字段進行搜索;使用到了剛建立起來的索引。INDEX PATH;顯然如果建立了主鍵【特殊的唯一索引】;現象將是一樣的。
我們可以這樣說;如果建立了主鍵或唯一索引;立馬就能生效;這也是我們在WIN的安裝、升級或維護過程中建立了一些表沒有做統計更新同樣能用到索引的原因。而如果建立的不是唯一索引;就需要執行統計更新才能用到索引。
實際上統計更新除了能決定是否使用到索引外;還有使用這些統計信息如何使用索引及其他方式進行查詢的目的。具體如何使用這些信息來決定查詢路徑就比較底層了。只知道通過執行update statistics命令,就可以使系統表systables、sysdistrib、syscolumns、sysindexes等表內的記錄數、表空間的頁數、記錄長度、字段不同值個數、字段值的分布、索引的層數等信息得到更新。而服務器在進行語法分析后能通過查詢優化器根據這些統計信息找到最有效的執行SQL的路徑。
select constrname from sysconstraints
where tabid in (select tabid from systables where tabname='basetab_pps');
下面可以談談如何恢復損壞得索引了:
1、 如果是普通得索引。這樣就相對得簡單了;刪除並重建他就可以了。
drop index idx-name;
create index idx-name on tabname(colname1,colname2…);
2、 如果是主鍵損壞;同樣可以刪除並重建他。
A、 刪除主鍵
select constrname from sysconstraints
where tabid in (select tabid from systables where tabname='tabname');
alter table tabname drop constraint cons_name;
B、 重建主鍵
alter table basetab_pps add constraint primary key (colname1,colname2…);
3、如果重建都有問題;那么最后一招;只有將表重建了。導出數據和建表語句;刪除表、重建表、重建索引。。。
關於索引的問題最后討論一下;統計更新【upadte statistics】的作用
舉個簡單的例子:
試驗一:
在dbaccess 中執行如下操作:
drop table t1
create table t1 (c1 int,c2 char(10));
create index i_t1 on t1 (c1);
insert into t1 values (1,1);
insert into t1 values (2,1);
insert into t1 values (3,1);
set explain on --
select * from t1 where c1 = 2;
在運行目錄下的sqexplain.out文件中看到:
QUERY:
------
select * from t1 where c1 = 2
Estimated Cost: 2
Estimated # of Rows Returned: 2
1) smpmml.t1: SEQUENTIAL SCAN
Filters: smpmml.t1.c1 = 2
試驗二:
在dbaccess 中執行如下操作:
drop table t1
create table t1 (c1 int,c2 char(10));
create index i_t1 on t1 (c1);
insert into t1 values (1,1);
insert into t1 values (2,1);
insert into t1 values (3,1);
update statistics for table t1;
set explain on
select * from t1 where c1 = 2;
在運行目錄下的sqexplain.out文件中看到:
QUERY:
------
select * from t1 where c1 = 2
Estimated Cost: 1
Estimated # of Rows Returned: 1
1) smpmml.t1: INDEX PATH
(1) Index Keys: c1
Lower Index Filter: smpmml.t1.c1 = 2
試驗三:
在dbaccess 中執行如下操作:
drop table t1
create table t1 (c1 int,c2 char(10));
create unique index i_t1 on t1 (c1);
insert into t1 values (1,1);
insert into t1 values (2,1);
insert into t1 values (3,1);
set explain on
select * from t1 where c1 = 2;
在運行目錄下的sqexplain.out文件中看到:
QUERY:
------
select * from t1 where c1 = 2
Estimated Cost: 2
Estimated # of Rows Returned: 1
1) smpmml.t1: INDEX PATH
(1) Index Keys: c1
Lower Index Filter: smpmml.t1.c1 = 2
分析一下:
試驗一:建立了一般的索引;對按索引字段進行搜索;但是沒有用到剛建立起來的索引。按全表掃描SEQUENTIAL SCAN進行查找。
試驗二:建立了一般的索引;並且進行了統計更新后;對按索引字段進行搜索;使用到建立起來的索引。INDEX PATH
試驗三:建立了唯一索引;對按索引字段進行搜索;使用到了剛建立起來的索引。INDEX PATH;顯然如果建立了主鍵【特殊的唯一索引】;現象將是一樣的。
我們可以這樣說;如果建立了主鍵或唯一索引;立馬就能生效;這也是我們在WIN的安裝、升級或維護過程中建立了一些表沒有做統計更新同樣能用到索引的原因。而如果建立的不是唯一索引;就需要執行統計更新才能用到索引。
實際上統計更新除了能決定是否使用到索引外;還有使用這些統計信息如何使用索引及其他方式進行查詢的目的。具體如何使用這些信息來決定查詢路徑就比較底層了。只知道通過執行update statistics命令,就可以使系統表systables、sysdistrib、syscolumns、sysindexes等表內的記錄數、表空間的頁數、記錄長度、字段不同值個數、字段值的分布、索引的層數等信息得到更新。而服務器在進行語法分析后能通過查詢優化器根據這些統計信息找到最有效的執行SQL的路徑。
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
systables:描述數據庫中的很張表;
syscolumns:描述數據庫中表的列;
sysindexes:描述數據庫中列的索引;
sysfragments:存儲了分段索引的片段信息;
sysfragauth:表識別列級權限;
sysviews:描述了數據庫中定義的每個視圖;
sysdpend:描述了視圖是如何依賴其他視圖和表的;
syssyntable:定義每一個同義詞及其所代表的對象;
sysconstraints:記錄了加載在數據庫表列上的約束;
sysreferences:列出了放置在數據庫上的參照約束,它為數據庫的每個參照約束建立一行
syscoldepend:記錄了涉及檢查約束的所有列,包括在約束中每列都會在syscoldepend表中創建一行;
sysprocedures:存放數據庫中每個過程的特征;
sysprocplan:裝載了過程執行所需的兩項內容(執行計划或查詢計划、附屬列表);
sysprocauth:描述授予存儲過程的權限;
systriggers:裝載了關於觸發器的信息;
sysblobs:確定BLOB列的存儲位置;
sysroleauth:描述授予用戶的角色;
sysobjstate:存儲了關於數據庫對象的狀態信息;
sysvlolations:違例或診斷表;
sysdefaults:描述數據庫中表的列的默認值;
syscolumns:描述數據庫中表的列;
sysindexes:描述數據庫中列的索引;
sysfragments:存儲了分段索引的片段信息;
sysfragauth:表識別列級權限;
sysviews:描述了數據庫中定義的每個視圖;
sysdpend:描述了視圖是如何依賴其他視圖和表的;
syssyntable:定義每一個同義詞及其所代表的對象;
sysconstraints:記錄了加載在數據庫表列上的約束;
sysreferences:列出了放置在數據庫上的參照約束,它為數據庫的每個參照約束建立一行
syscoldepend:記錄了涉及檢查約束的所有列,包括在約束中每列都會在syscoldepend表中創建一行;
sysprocedures:存放數據庫中每個過程的特征;
sysprocplan:裝載了過程執行所需的兩項內容(執行計划或查詢計划、附屬列表);
sysprocauth:描述授予存儲過程的權限;
systriggers:裝載了關於觸發器的信息;
sysblobs:確定BLOB列的存儲位置;
sysroleauth:描述授予用戶的角色;
sysobjstate:存儲了關於數據庫對象的狀態信息;
sysvlolations:違例或診斷表;
sysdefaults:描述數據庫中表的列的默認值;
