創(chuàng)建索引語法:
我們一直強(qiáng)調(diào)網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站建設(shè)對于企業(yè)的重要性,如果您也覺得重要,那么就需要我們慎重對待,選擇一個安全靠譜的網(wǎng)站建設(shè)公司,企業(yè)網(wǎng)站我們建議是要么不做,要么就做好,讓網(wǎng)站能真正成為企業(yè)發(fā)展過程中的有力推手。專業(yè)的建站公司不一定是大公司,創(chuàng)新互聯(lián)建站作為專業(yè)的網(wǎng)絡(luò)公司選擇我們就是放心。
CREATE[UNIQUE]|[BITMAP]INDEXindex_name
--unique表示唯一索引
ONtable_name([column1[ASC|DESC],column2
--bitmap,創(chuàng)建位圖索引
[ASC|DESC],?]|[express])[TABLESPACEtablespace_name][PCTFREEn1]
--指定索引在數(shù)據(jù)塊中空閑空間
[STORAGE(INITIALn2)][NOLOGGING]
--表示創(chuàng)建和重建索引時允許對表做DML操作,默認(rèn)情況下不應(yīng)該使用
[NOLINE][NOSORT];
--表示創(chuàng)建索引時不進(jìn)行排序,默認(rèn)不適用,如果數(shù)據(jù)已經(jīng)是按照該索引順序排列的可以使用
擴(kuò)展資料:
1、如果有兩個或者以上的索引,其中有一個唯一性索引,而其他是非唯一,這種情況下oracle將使用唯一性索引而完全忽略非唯一性索引
2、至少要包含組合索引的第一列(即如果索引建立在多個列上,只有它的第一個列被where子句引用時,優(yōu)化器才會使用該索引)
3、小表不要簡歷索引
4、對于基數(shù)大的列適合建立B樹索引,對于基數(shù)小的列適合簡歷位圖索引
5、列中有很多空值,但經(jīng)常查詢該列上非空記錄時應(yīng)該建立索引
6、經(jīng)常進(jìn)行連接查詢的列應(yīng)該創(chuàng)建索引
7、使用createindex時要將最常查詢的列放在最前面
8、LONG(可變長字符串?dāng)?shù)據(jù),最長2G)和LONGRAW(可變長二進(jìn)制數(shù)據(jù),最長2G)列不能創(chuàng)建索引
9、限制表中索引的數(shù)量(創(chuàng)建索引耗費(fèi)時間,并且隨數(shù)據(jù)量的增大而增大;索引會占用物理空間;當(dāng)對表中的數(shù)據(jù)進(jìn)行增加、刪除和修改的時候,索引也要動態(tài)的維護(hù),降低了數(shù)據(jù)的維護(hù)速度)
對三個字段建立索引:\x0d\x0acreate index Stuname on student(name);\x0d\x0acreate index Stusex on student(sex);\x0d\x0acreate index Stugrade on student(grade);\x0d\x0a注意的問題,考慮是不是要建立唯一索引(unique),如果有學(xué)號的話,可以考慮建立唯一索引引。\x0d\x0a再就是對經(jīng)常查詢,但又相對穩(wěn)定的可以建立聚簇索引,提高查詢效率
影響命中率的因素有四種:字典表活動、臨時段活動、回滾段活動、表掃描, 應(yīng)用DBA可以對這四種因素進(jìn)行分析,找出數(shù)據(jù)庫命中率低的癥結(jié)所在。 1)字典表活動 當(dāng)一個SQL語句第一次到達(dá)Oracle內(nèi)核時數(shù)據(jù)庫對SQL語句進(jìn)行分析,包含在查詢中的數(shù)據(jù)字典對象被分解,產(chǎn)生SQL執(zhí)行路徑。如果SQL語句指向一個不在SGA中的對象?表或視圖,Oracle執(zhí)行SQL語句到數(shù)據(jù)典中查詢有關(guān)對象的信息。數(shù)據(jù)塊從數(shù)據(jù)字典表被讀取到SGA的數(shù)據(jù)緩存中。由于每個數(shù)據(jù)字典都很小,因此,我們可緩存這些表以提高對這些表的命中率。但是由于數(shù)據(jù)字典表的數(shù)據(jù)塊在SGA中占據(jù)空間,當(dāng)增加全部的命中率時,它們會降低表數(shù)據(jù)塊的可用空間, 所以若查詢所需的時間字典信息已經(jīng)在SGA緩存中,那么就沒有必要遞歸調(diào)用。 2)臨時段的活動 當(dāng)用戶執(zhí)行一個需要排序的查詢時,Oracle設(shè)法對內(nèi)存中排序區(qū)內(nèi)的所有行進(jìn)行排序,排序區(qū)的大小由數(shù)據(jù)庫的init.ora文件的數(shù)確定。如果排序區(qū)域不夠大,數(shù)據(jù)庫就會在排序操作期間開辟臨時段。臨時段會人為地降低OLTP(online transaction processing)應(yīng)用命中率,也會降低查詢進(jìn)行排序的性能。如果能在內(nèi)存中完成全部排序操作,就可以消除向臨時段寫數(shù)據(jù)的開銷。所以應(yīng)將SORT_AREA_SIZE設(shè)置得足夠大,以避免對臨時段的需要。這個參數(shù)的具體調(diào)整方法是:查詢相關(guān)數(shù)據(jù),以確定這個參數(shù)的調(diào)整。 select * from v$sysstat where name='sorts(disk)'or name='sorts(memory); 大部分排序是在內(nèi)存中進(jìn)行的,但還有小部分發(fā)生在臨時段, 需要調(diào)整 值,查看init.ora文件的 SORT_AREA_SIZE值,參數(shù)為:SORT_AREA_SIZE=65536;將其調(diào)整到SORT_AREA_SIZE=131072、這個值調(diào)整后,重啟ORACLE數(shù)據(jù)庫即可生效。 3)回滾段的活動 回滾段活動分為回滾活動和回滾段頭活動。對回滾段頭塊的訪問會降低應(yīng)用的命中率, 對OLTP系統(tǒng)命中率的影響最大。為確認(rèn)是否因?yàn)榛貪L段影響了命中率,可以查看監(jiān)控輸出報表中的“數(shù)據(jù)塊相容性讀一重寫記錄應(yīng)用” 的統(tǒng)計(jì)值,這些統(tǒng)計(jì)值是用來確定用戶從回滾段中訪問數(shù)據(jù)的發(fā)生次數(shù)。 4)表掃描 通過大掃描讀得的塊在數(shù)據(jù)塊緩存中不會保持很長時間, 因此表掃描會降低命中率。為了避免不必要的全表掃描,首先是根據(jù)需要建立索引,合理的索引設(shè)計(jì)要建立人對各種查詢的分析和預(yù)測上,筆者會在SQL優(yōu)化中詳細(xì)談及;其次是將經(jīng)常用到的表放在內(nèi)存中,以降低磁盤讀寫次數(shù)。
方法如下: Oracle中建立索引,會提高查詢速度: create index 索引名 on 表名(列名); 例如: create index index_userid on tbl_detail(userid); 如何找數(shù)據(jù)庫表的主鍵字段的名稱? SELECT * FROM user_constraints WHERE CONSTRAINT_TYPE='P' a...
oracle對于數(shù)據(jù)庫中的表信息,存儲在系統(tǒng)表中。查詢已創(chuàng)建好的表索引,可通過相應(yīng)的sql語句到相應(yīng)的表中進(jìn)行快捷的查詢:\x0d\x0a1. 根據(jù)表名,查詢一張表的索引\x0d\x0a\x0d\x0aselect * from user_indexes where table_name=upper('表名');\x0d\x0a\x0d\x0a2. 根據(jù)索引號,查詢表索引字段\x0d\x0a\x0d\x0aselect * from user_ind_columns where index_name=('索引名');\x0d\x0a\x0d\x0a3.根據(jù)索引名,查詢創(chuàng)建索引的語句\x0d\x0a\x0d\x0aselect dbms_metadata.get_ddl('INDEX','索引名', ['用戶名']) from dual ; --['用戶名']可省,默認(rèn)為登錄用戶\x0d\x0a\x0d\x0aPS:dbms_metadata.get_ddl還可以得到建表語句,如:\x0d\x0a\x0d\x0aSELECT DBMS_METADATA.GET_DDL('TABLE','表名', ['用戶名']) FROM DUAL ; //取單個表的建表語句,['用戶名']可不輸入,默認(rèn)為登錄用戶\x0d\x0aSELECT DBMS_METADATA.GET_DDL('TABLE',u.table_name) FROM USER_TABLES u; //取用戶下所有表的建表語句\x0d\x0a\x0d\x0a當(dāng)然,也可以用pl/sql developer工具來查看相關(guān)的表的各種信息。