一 ROWID的概念
站在用戶的角度思考問題,與客戶深入溝通,找到平城網站設計與平城網站推廣的解決方案,憑借多年的經驗,讓設計與互聯網技術結合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:成都網站建設、成都做網站、企業(yè)官網、英文網站、手機端網站、網站推廣、申請域名、虛擬空間、企業(yè)郵箱。業(yè)務覆蓋平城地區(qū)。
存儲了row在數據文件中的具 *** 置 位編碼的數據 A Z a z + 和 /
row在數據塊中的存儲方式
SELECT ROWID last_name FROM hr employees WHERE department_id = ;
比如 OOOOOOFFFBBBBBBRRR
OOOOOO data object number 對應dba_objects data_object_id
FFF file# 對應v$datafile file#
BBBBBB block#
RRR row#
Dbms_rowid包
SELECT dbms_rowid rowid_block_number( AAAGFqAABAAAIWEAAA ) from dual;
具體到特定的物理文件
二 索引的概念
類似書的目錄結構
Oracle 的 索引 對象 與表關聯的可選對象 提高SQL查詢語句的速度
索引直接指向包含所查詢值的行的位置 減少磁盤I/O
與所索引的表是相互獨立的物理結構
Oracle 自動使用并維護索引 插入 刪除 更新表后 自動更新索引
語法 CREATE INDEX index ON table (column[ column] );
B tree結構(非bitmap)
[一]了解索引的工作原理
表 emp
目標 查詢Frank的工資salary
建立索引 create index emp_name_idx on emp(name);
[試驗]測試索引的作用
運行/rdbms/admin/utlxplan 腳本
建立測試表
create table t as select * from dba_objects;
insert into t select * from t;
create table indextable
as select rownum id owner object_name subobject_name
object_id data_object_id object_type created
from t;
set autotrace trace explain
set timing on
分析表 可以得到cost
查詢 object_name= DBA_INDEXES
在object_name列上建立索引
再查詢
[思考]索引的代價
插入 更新
三 唯一索引
何時創(chuàng)建 當某列任意兩行的值都不相同
當建立Primary Key(主鍵)或者Unique constraint(唯一約束)時 唯一索引將被自動建立
語法 CREATE UNIQUE INDEX index ON table (column);
演示
四 組合索引
何時創(chuàng)建 當兩個或多個列經常一起出現在where條件中時 則在這些列上同時創(chuàng)建組合索引
組合索引中列的順序是任意的 也無需相鄰 但是建議將最頻繁訪問的列放在列表的最前面
演示(組合列 單獨列)
五 位圖索引
何時創(chuàng)建
列中有非常多的重復的值時候 例如某列保存了 性別 信息
Where 條件中包含了很多OR操作符
較少的update操作 因為要相應的跟新所有的bitmap
結構 位圖索引使用位圖作為鍵值 對于表中的每一數據行位圖包含了TRUE( ) FALSE( ) 或NULL值
優(yōu)點 位圖以一種壓縮格式存放 因此占用的磁盤空間比標準索引要小得多
語法 CREATE BITMAP INDEX index ON table (column[ column] );
掩飾
create table bitmaptable as select * from indextable where owner in( SYS PUBLIC );
分析 查找 建立索引 查找
六 基于函數的索引
何時創(chuàng)建 在WHERE條件語句中包含函數或者表達式時
函數包括 算數表達式 PL/SQL函數 程序包函數 SQL函數 用戶自定義函數
語法 CREATE INDEX index ON table (FUNCTION(column));
演示
必須要分析表 并且query_rewrite_enabled=TRUE
或者使用提示/*+ INDEX(ic_index)*/
七 反向鍵索引
目的 比如索引值是一個自動增長的列
多個用戶對集中在少數塊上的索引行進行修改 容易引起資源的爭用 比如對數據塊的等待 此時建立反向索引
性能問題
語法
重建為標準索引 反之不行
八 鍵壓縮索引
比如表landscp的數據如下
site feature job
Britten Park Rose Bed Prune
Britten Park Rose Bed Mulch
Britten Park Rose Bed Spray
Britten Park Shrub Bed Mulch
Britten Park Shrub Bed Weed
Britten Park Shrub Bed Hoe
……
查詢時 以上 列均在where條件中同時出現 所以建立基于以上 列的組合索引 但是發(fā)現重復值很多 所以考慮壓縮特性
Create index zip_idx
on landscp(site feature job)
press ;
將索引項分成前綴(prefix)和后綴(postfix)兩部分 前兩項被放置到前綴部分
Prefix : Britten Park Rose Bed
Prefix : Britten Park Shrub Bed
實際所以的結構為
Prune
Mulch
Spray
Mulch
Weed
Hoe
特點 組合索引的前綴部分具有非選擇性時 考慮使用壓縮 減少I/O 增加性能
九 索引組織表(IOT)
將表中的數據按照索引的結構存儲在索引中 提高查詢速度
犧牲插入更新的性能 換取查詢性能 通常用于數據倉庫 提供大量的查詢 極少的插入修改工作
必須指定主鍵 插入數據時 會根據主鍵列進行B樹索引排序 寫入磁盤
十 分區(qū)索引
簇:
A cluster is a group of tables that share the same data blocks because they share mon columns and are often used together
lishixinzhi/Article/program/Oracle/201311/17769
當索引的碎片過多時,會影響執(zhí)行查詢的速度,從而影響到我們的工作效率。這時候采取的最有利的措施莫過于重建索引了。本文主要介紹了Oracle數據庫中檢查索引碎片并重建索引的過程,接下來我們就開始介紹這一過程。 重建索引的步驟如下: 1. 確認基本信息 登入數據庫,找到專門存放index 的tablespace,并且這個tablespace下所有index的owner都是tax.將index專門存放在一個獨立的tablespace, 與數據表的tablespace分離,是常用的數據庫設計方法。 height 4 pct_used 50% del_lf_rows / lf_rows +0.001 0.03 g ) 3. google上下載了遍歷所有index腳本發(fā)現anlyze index .... validate structure只能填充單個index分析信息,于是google了下,從網上下了個Loop 腳本,遍歷索引空間下所有的索引名字,并且可以把所有index的分析信息存放到自己建立的一個用戶表中。 4. anlyze index 鎖定index發(fā)現下載的腳本不好用,應為anlyze index在分析索引前要爭取獨占鎖,鎖住index,很明顯有些index正在被應用系統的使用,所以運行anlyze失敗。這里吸取的教訓是,盡量晚上做這種事。但是本人比較喜歡準時回家,所以在語句中添加Exception Handler,拋出anlyze index執(zhí)行失敗的那些index 名稱,使腳本正常運行完畢。并且根據打印到前臺的index name手動執(zhí)行那些index分析。 5. 總結雖然發(fā)現522個index中有160個符合上面的判斷的依據。但是發(fā)現索引都不大,而那些擁有百萬leaf的索引又沒有符合上面的判斷條件,所以結論是無需index rebuild online. 沒有啥碎片。 rebuild index online,對那些有大量DML操作的大索引是有益的??梢悦總€月季度做一次針對較大索引的rebuild。通常哪怕rebuild index online也會造成I/O爭用,所以有無online意義不大,可以放到3-5個晚上,分批執(zhí)行rebuild index,鎖定index,不讓用戶用(沒有用戶等入的時候),并且加上paralle 8關鍵字,應為發(fā)現數據庫服務器有8個cpu processors.
用scott用戶打開兩個窗口
1、外鍵無索引時,子表更新外鍵未提交,主表更新非子表引用的主鍵時被阻塞
會話1:
create table t1 (x int primary key);
insert into t1 values(1);
insert into t1 values(2);
insert into t1 values(3);
commit;
create table t2(y int references t1);
insert into t2 values(1);
commit;
update t2 set y=2 where y=1;
會話2:
update t1 set x=4 where x=3; //會話被阻塞
2、外鍵有索引時,子表更新外鍵未提交,主表更新非子表引用的主鍵時不會被阻塞
會話1:
create index t2_index on t2(y) ; //創(chuàng)建外鍵索引
update t2 set y=2 where y=1;
會話2:
update t1 set x=4 where x=3;
已更新 1 行;//可以正常更新
3、外鍵有無索引,對于子表更新外鍵未提交,主表更新相對應的主鍵無影響,更新主鍵的session都會被阻塞
會話1:
update t2 set y=2 where y=1;
會話2:
update t1 set x=4 where x=1; //更新子表已引用的
會話被阻塞。
會話1:
update t2 set y=2 where y=1;
會話2:
update t1 set x=4 where x=2 ; //更新子表將要引用的
會話被阻塞。――很好理解,主表要判斷是否違反約束
二、更新子表非外鍵列未提交
1、外鍵無索引,更新主表已被外鍵引用的主鍵時,更新主鍵的session被阻塞
會話1:
create table t1 (x int primary key,x1 int);
insert into t1 values(1,1);
insert into t1 values(2,2);
insert into t1 values(3,3);
commit ;
create table t2(y int references t1,y1 int);
insert into t2 values(1,1);
commit ;
update t2 set y1=2 where y1=1;
會話2:
update t1 set x=4 where x=1; //更新外鍵引用的主鍵
會話被阻塞。
2、外鍵有索引,更新主表已被外鍵引用的主鍵時,更新主鍵的session不會被阻塞而報約束錯誤
會話1:
create index t2_index on t2(y);
update t2 set y1=2 where y1=1;
會話2:
update t1 set x=4 where x=1
*
ERROR 位于第 1 行:
ORA-02292: 違反完整約束條件 (SCOTT.SYS_C001607) - 已找到子記錄日志
3、外鍵無索引,更新主表未被外鍵引用的主鍵時,更新主鍵的session被阻塞
會話1:
drop index t2_index;
update t2 set y1=2 where y1=1
會話2:
update t1 set x=4 where x=2;
會話被阻塞。
4、外鍵有索引,更新主表未被外鍵引用的主鍵時,更新主鍵的session不會被阻塞
會話1:
create index t2_index on t2(y);
update t2 set y1=2 where y1=1;
會話2:
update t1 set x=4 where x=2;
已更新 1 行。
另外在一個主表有on delete cascade,子表沒有外鍵索引時,對主表操作會級聯到子表,子表將進行全表掃描。
總結:在需要更新主鍵的情況下,最好是創(chuàng)建子表的外鍵索引。
創(chuàng)建索引語法:
CREATE [UNIQUE] | [BITMAP] INDEX index_name
--unique表示唯一索引
ON table_name([column1 [ASC|DESC],column2
--bitmap,創(chuàng)建位圖索引
[ASC|DESC],…] | [express])[TABLESPACE tablespace_name][PCTFREE n1]
--指定索引在數據塊中空閑空間
[STORAGE (INITIAL n2)][NOLOGGING]
--表示創(chuàng)建和重建索引時允許對表做DML操作,默認情況下不應該使用
[NOLINE][NOSORT];
--表示創(chuàng)建索引時不進行排序,默認不適用,如果數據已經是按照該索引順序排列的可以使用
擴展資料:
1、如果有兩個或者以上的索引,其中有一個唯一性索引,而其他是非唯一,這種情況下oracle將使用唯一性索引而完全忽略非唯一性索引
2、至少要包含組合索引的第一列(即如果索引建立在多個列上,只有它的第一個列被where子句引用時,優(yōu)化器才會使用該索引)
3、小表不要簡歷索引
4、對于基數大的列適合建立B樹索引,對于基數小的列適合簡歷位圖索引
5、列中有很多空值,但經常查詢該列上非空記錄時應該建立索引
6、經常進行連接查詢的列應該創(chuàng)建索引
7、使用create index時要將最常查詢的列放在最前面
8、LONG(可變長字符串數據,最長2G)和LONG RAW(可變長二進制數據,最長2G)列不能創(chuàng)建索引
9、限制表中索引的數量(創(chuàng)建索引耗費時間,并且隨數據量的增大而增大;索引會占用物理空間;當對表中的數據進行增加、刪除和修改的時候,索引也要動態(tài)的維護,降低了數據的維護速度)
A. oracle 提供了收集數據庫統計信息的系統包,例如統計scott用戶信息只需要執(zhí)行:
exec dbms_stats.gather_schema_stats(
ownname = 'SCOTT',
options = 'GATHER AUTO',
estimate_percent = dbms_stats.auto_sample_size,
method_opt = 'for all columns size repeat',
degree = 15
);
dbms_stat.gather_schema_stats 的參數說請查相關資料,這里就不詳述了。
B. 要定期執(zhí)行用戶統計信息很簡單,只要在 oracle job 中調用這個過程就可以了,設置好初次調用時間和調用時間間隔即可。
以上的操作都能在plsql中操作。
------索引名不能重復,如果要重新建同名索引,必須把以前的索引刪掉在建索引
-----刪除索引
drop index 索引名;
-----創(chuàng)建索引
create index 索引名 on 表名 (表中的字段,表中的字段)
tablespace 指定的表空間
pctfree 10
initrans 2
maxtrans 255
storage
(
initial 64K
minextents 1
maxextents unlimited
);
名稱欄目:oracle如何更新索引 oracle更新索引字段
文章轉載:http://muchs.cn/article24/hhejce.html
成都網站建設公司_創(chuàng)新互聯,為您提供外貿建站、搜索引擎優(yōu)化、網頁設計公司、標簽優(yōu)化、自適應網站、定制網站
聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯