select * from user_ind_columns where table_name = upper('agent_master') // agent_master為表名
1.應(yīng)該是可行的,具體會(huì)不會(huì)節(jié)省時(shí)間試一下就可以了。
2.大概每個(gè)月存儲(chǔ)四五十萬(wàn)的數(shù)據(jù),里面只保存最新四個(gè)月的數(shù)據(jù) 每次create這7個(gè)索引用時(shí)都特別長(zhǎng),大概需要三四個(gè)小時(shí); 200萬(wàn)的數(shù)據(jù),重建索引花費(fèi)的時(shí)間太長(zhǎng)了;很奇怪。
3.估計(jì)之前的先drop掉索引,然后插入數(shù)據(jù)完畢后create索引也是為了避免插入數(shù)據(jù)時(shí),索引對(duì)插入效率的影響。
提供一種直觀的方法:(前提是有索引。
如果沒有索引可以直接新建唯一索引)1、使用plsql工具連接數(shù)據(jù)庫(kù),輸入表名
2、將光標(biāo)移動(dòng)到表名上,鼠標(biāo)右鍵選擇編輯(edit)
3、在彈出來(lái)的窗口中切換到索引頁(yè)簽(index)
4、在類型(type)那一欄選unique,點(diǎn)擊窗口左下角的應(yīng)用(apply)保存即可
索引。當(dāng)然還是效率更高一些了。
查看約束
select * from user_constraints where table_name='';
Oracle中我們經(jīng)常使用Date字段類型記錄日期和時(shí)間,有的時(shí)候還在這個(gè)字段上建立索引。
然后通過Java程序訪問數(shù)據(jù)庫(kù)的時(shí)候,我們很自然的類似這樣使用:select * from table where endDate>? and endDate<?,然后通過PreparedStatement預(yù)編譯,再通過setTimestamp傳入由java.util.Date轉(zhuǎn)成java.sql.Timestamp的參數(shù)(因?yàn)閖ava.sql.Date只有日期,java.sql.Time只有時(shí)間,所以我們只能用java.sql.Timestamp類型)。我們會(huì)認(rèn)為這樣應(yīng)該走索引區(qū)間掃描,效率應(yīng)該是非常高的。
而事實(shí)上,Oracle會(huì)把sql解釋成如下這樣來(lái)執(zhí)行:select * from table where TO_TIMESTAMP(endDate)>? and TO_TIMESTAMP(endDate)<?; 為什么?因?yàn)閭魅氲膮?shù)是timestamp類型,Oracle從9.2版本以后支持這種類型,所以O(shè)racle做了這樣的轉(zhuǎn)換,結(jié)果就是這個(gè)SQL執(zhí)行變成了全表掃描。我們做的試驗(yàn),加了一個(gè)index hint,強(qiáng)制走時(shí)間索引字段,結(jié)果效率也不高,sql執(zhí)行變成了全索引掃描,和全表掃描沒多大區(qū)別。結(jié)果效率還是低。
不光直接使用JDBC會(huì)是這樣,Spring,iBatis在處理傳入?yún)?shù)是java.util.Date類型的時(shí)候,都會(huì)使用setTimestamp設(shè)定參數(shù),所以都需要注意。
這種現(xiàn)象多出現(xiàn)在分區(qū)表,之后創(chuàng)建和刪除分區(qū)的時(shí)候引起全局索引失效,這個(gè)一般的解決方法是重現(xiàn)創(chuàng)建索引,還有一種是把全局索引創(chuàng)建成local的就可以了。這個(gè)您可以上網(wǎng)查查全局索引和local索引的區(qū)別。
不能直接修改,只能先drop單列的index.再創(chuàng)建多列的復(fù)合索引。
有兩種方法: (1)視圖dba_constraints (2)視圖dba_indexes 設(shè)置一個(gè)字段,為主鍵,這個(gè)主鍵就是不重復(fù)的,主鍵的內(nèi)容可以使用oracle的sequence。
方法一、 視圖dba_constraints,這張表中有所有的表的約束,擁有唯一約束的字段就擁有唯一索引,其中Constraint_type的值應(yīng)該是U,不過值是R的表示主鍵,這個(gè)也存在唯一索引,不知道你要不要找這種,所以個(gè)人認(rèn)為在這張表內(nèi)能找到。方法二: 視圖dba_indexes,這里的index_type應(yīng)該也能查到唯一索引。
方法如下:
Oracle中建立索引,會(huì)提高查詢速度: create index 索引名 on 表名(列名);
例如:
create index index_userid on tbl_detail(userid);
如何找數(shù)據(jù)庫(kù)表的主鍵字段的名稱?
SELECT * FROM user_constraints WHERE CONSTRAINT_TYPE='P' and table_name='AAA'; select * from dba_cons_columns where CONSTRAINT_NAME='SYS_AAA';
Oracle 在創(chuàng)建主鍵(可以不加constraint SYS_AAA),會(huì)為庫(kù)表自動(dòng)創(chuàng)建索引,
索引的列為主鍵列。 并且當(dāng)庫(kù)表某些列名或者庫(kù)表名改變時(shí)候,
Oracle自動(dòng)創(chuàng)建的索引SYS_AAA,中的索引列也會(huì)自動(dòng)更新(類似于視圖),并且SYS_AAA會(huì)與名字更改后的庫(kù)表還是保持索引關(guān)系。 關(guān)鍵系統(tǒng)庫(kù)表: desc dba_constraints desc dba_cons_columns
desc dba_indexes desc dba_ind_columns desc DBA_TAB_COLUMNS
例子1:更改庫(kù)表的列名
ALTER TABLE AAA RENAME COLUMN ID TO AAA_ID; create table AAA ( ID NUMBER(8), NAME CHAR(20),
constraint SYS_AAA primary key(ID) );
//查找約束名字
select c.CONSTRAINT_NAME,c.table_name,cc.COLUMN_NAME from user_constraints c, user_cons_columns cc
where c.constraint_name=cc.constraint_name and c.table_name ='AAA' AND C.CONSTRAINT_TYPE='P';
CONSTRAINT_NAME TABLE_NAME COLUMN_NAME
SYS_AAA AAA ID
//查找索引
select index_name,index_type,uniqueness from user_indexes where table_name='AAA'; INDEX_NAME INDEX_TYPE UNIQUENES