本課內容屬於Oracle性能調優部分的初級內容,爲常規的工作內容,包括 索引的使用和 表分析。
環境準備
概述
針對前面章節中用到的數據庫表teachers:
1.建立一個1:1的表記錄其銀行賬戶記錄表;
2.再建立一個1:n的賬戶交易信息表,用來記錄用戶從賬戶中存錢和取錢的交易記錄。
3.編寫一個程序,生成該交易表的記錄信息,要求至少要達到100萬以上記錄。
•表“教師賬戶信息表(TEACHER_ACCOUNT)”
•表“賬戶交易表(ACCOUNT_TRADE)”
•存儲過程“P_INIT_ACCOUNT_TRADE”
使用PD設計表及初始化賬戶數據
sql代碼:
- --3.初始化賬戶信息(節選代碼)
- delete from teacher_account;
- insert into teacher_account(jsbh,yhkh,dqye) values('001','6002780207013762981',15000.00);
- insert into teacher_account(jsbh,yhkh,dqye) values('002','6002780207013762923',15000.00);
- insert into teacher_account(jsbh,yhkh,dqye) values('003','6002780207013760181',15000.00);
- insert into teacher_account(jsbh,yhkh,dqye) values('004','6002780207013739826',15000.00);
- insert into teacher_account(jsbh,yhkh,dqye) values('005','6002780207313762981',15000.00);
- insert into teacher_account(jsbh,yhkh,dqye) values('006','6002780207413762923',15000.00);
- insert into teacher_account(jsbh,yhkh,dqye) values('007','6002780207513760181',15000.00);
- insert into teacher_account(jsbh,yhkh,dqye) values('008','6002780207613739826',15000.00);
- insert into teacher_account(jsbh,yhkh,dqye) values('009','6212780207013762981',25000.00);
存儲空間估算及表空間大小調整
1.數據類型所佔最大存儲容量表
類型
|
字節數
|
平均字節數
|
CHAR(n)
|
n
|
n
|
VARCHAR(n)
|
n
|
已經存在數據的表,可以通過統計得出;
剛設計的表,一般取值在30%-60%,建議40%
|
DATE
|
7
|
7
|
NUMBER(p,s)
|
最低(p+1)/2+1
|
一般採用最低
|
NUMBER
|
19
|
|
2.估算結果表(ACCOUNT_TRADE)
列名
|
類型
|
最大
大小
|
平均
大小
|
列名
|
類型
|
最大
大小
|
平均
大小
|
YHKH
|
CHAR(19)
|
19
|
19
|
ND
|
INTEGER
|
19
|
4
|
JYSJ
|
CHAR(19)
|
19
|
19
|
YD
|
CHAR(2)
|
2
|
2
|
JYJY
|
NUMBER(16,2)
|
9
|
9
|
RQ
|
CHAR(2)
|
2
|
2
|
JYQYE
|
NUMBER(16,2)
|
9
|
9
|
XSS
|
CHAR(2)
|
2
|
2
|
JYHYE
|
NUMBER(16,2)
|
9
|
9
|
FZS
|
CHAR(2)
|
2
|
2
|
XM
|
VARCHAR2(10)
|
10
|
4
|
MS
|
CHAR(2)
|
2
|
2
|
XB
|
CHAR(1)
|
1
|
1
|
DRJYCS
|
INTEGER
|
19
|
8
|
XL
|
VARCHAR2(10)
|
10
|
4
|
XRSJ
|
DATE
|
7
|
7
|
SSXB
|
CHAR(3)
|
3
|
3
|
|
|||
每行最大大小:144 bytes
|
每行平均大小:104 bytes
|
3.表空間容量估算
•按最大容量估算,100萬行記錄存儲空間爲:
(144*1000000)/(1024*1024) ≈ 140M
•按平均容量估算,100萬行記錄存儲空間爲:
(106*1000000)/(1024*1024) ≈ 100M
•考慮建立索引佔存儲容量的20%(此爲最大):
最大爲 30M,平均爲20M
• 按200萬行最大記錄算,考慮還要備份表,則爲:
(140+30) * 2 * 2 = 680M ≈ 700M
1.請通過OEM調整用戶默認表空間和索引表空間大小分別爲500M和200M
2.調整方法本處不再贅述
3.從上一頁表格可以看出,存儲尚有優化空間,請各位思考哪兒可以再優化?
交易數據準備
方法一:通過程序生成:
1).假定24個老師,共22年每天產生10次交易,則交易數據量爲:
24*22*36*10 = 1,927,200萬行;
2).每日交易的時間和金額隨機生成,但日存錢的最大金額爲10萬,
取錢的最大金額爲餘額 – 1;至於存錢還是取錢也是隨機生
成;
3).由於一次寫入百萬行級的數據,會產生很大的回滾段,易造成
數據庫崩潰,故每寫完2000行記錄提交一次;
4).附件的程序故意留有取錢不能超過餘額的BUG,請學有餘力的
學員修改之;
5).警告:根據Oracle服務器性能和資源不同,此程序的執行可能
需要長達3天以上的時間才能完成!
方法二:導入數據:
1).在數據庫中刪除表ACCOUNT_TRADE;
2).將日誌模式調整爲非歸檔模式,方法參考前面的課程,原因是:
a.一次導入的數據量非常大,同樣可能產生重做日誌和回滾段空
間不足導致的數據庫崩潰問題;如果不調整,需要修改系統參
數 db_recovery_file_dest_size參數值,一般是加大到至少要
4G,從而要求更多的磁盤空間;
b.此時歸檔日誌模式導入會比非歸檔日誌模式導入慢很多。
3).使用IMP命令導入數據,方法也請參考前面的課程內容。
爲什麼需要索引(優點和缺點)
索引的概念
在關係數據庫中,行存儲的物理位置是無關緊要的,但當需要找到該行時 行位置卻又是至關重要的。Oracle對每一行數據使用一個RowID來標示,其中存 儲了行的準確位置(行所在的文件、在該文件中的塊、以及塊中的行地址)。 索引是一種提供在表中快速定位某一行數據的一種Oracle內部結構。
•索引是Oracle內部的一種數據結構,其中存放多行 數據(包括 一個索引的列的拷貝和在 被索引的表的相應的RowID ),可以理解爲Oracle表的一個小型化拷貝;
•索引的目的是爲了加快數據檢索速度。
索引的創建、修改和刪除
1.索引的創建
CREATE [UNIQUE | BITMAP] INDEX index_name ON table_name
( column_name[ ASC
| DESC][,c olumn_name [ASC
| DESC]] … )
[CLUSTER cluster_name ]
[INITRANS n] [MAXTRANS n] [PCTFREE n]
[STORGE storage] [TABLESPACE t ablespace_name ]
[NO sort]
l 其中UNIQUE指定索引所基於的列(或多列)值必須唯一;
l 默認的索引是非唯一索引;
l BITMAP指定建立位圖索引而不是b-tree索引;
l index_name表示創建的索引名字;
l table_name指要創建索引的表;
l cluster_name指創建索引的簇;
l n可以爲任意正整數值;
l tablespace_name表示要用於該索引的表空間;
l No sort告訴Oracle該表已經排序因此不需要再重新排序。
必須具有CREATE ANY INDEX系統權限
存儲參數選項建議使用默認,不要隨便修改或徵求DBA的意見
l 除使用語句、CASE工具外,還可以使用OEM創建索引
l 一般建議使用PD創建索引
l 具體的舉例請參考老師的現場講解
2.索引的修改
常用語法爲:
ALTER INDEX index_name REBUILD;
ALTER INDEX index_name REBUILD
ONLINE;
l 此語句代表對某個索引進行重構,必須具有ALTER ANY INDEX系統權限
l 不帶ONLINE表示只掃描現有的索引塊來實現索引的重建
l 帶ONLINE表示掃描表而不是掃描現有的索引塊來實現索引的重建
l 一般的, 推薦 每隔一個長時期對索引進行重建,即先刪除後建立;在此長時期範圍內, 可以多次進行索引重構
l 修改索引建議使用語句,此爲最快的途徑,而不是OEM工具
3.索引的刪除
常用語法爲:
DROP INDEX index_name ;
l 此語句代表對某個索引進行刪除,刪除後則相應的索引存儲空間會被釋放
l 刪除索引必須有DROP ANY INDEX系統權限
l 一般建議使用語句刪除索引,當然也可以使用PL/SQL Developer、Toad、OEM等 工具,但顯然語句語法簡單,操作效率也更高
索引的類型
1.b-tree索引
b-tree索引,即平衡樹索引(balanced tree),是最常見的一種數據索引形式,是通過採用 帶有值的順序的列表範圍來組織數據。其中包括三種組件:
1.葉子節點(Leaf node):包括數據行的鍵值、鍵值對應數據行的 ROWID。
2.分支節點(Branch node):最小的鍵值前綴,用於在(本塊的)兩個鍵值之間做出分支選擇,指向包含所查找鍵值的子塊的指針所有的鍵值-ROWID 對都與其左右的兄弟節點向鏈接,並按照的順序排序。
3.根節點(Root node):一個B樹索引只有一個根節點,它實際就是位於樹的最頂端的分支節點。
(1).兩種節點(塊)
A.分節點用來搜索,葉子節點用來存儲數據。根節點存儲索引的低層分支節點的數據。 由於所有的葉子節點均會自動的存儲成相同的深度,所以稱爲“平 衡樹索引”, 故此,從任何葉子處檢索數據消耗的時間都是相同的。
B.平衡樹的高度,指的是從根節點都葉子節點所經過的節點數;分支節點的高度等於平衡樹的高度減1。
C.對於分支節點塊(包括根節點塊)來說,其所包含的索引條目都是按照順序排列的(缺省是升序排列,也可以在創建索引時指定爲降序排列)。每個索引條目(也可以叫做每條記錄)都具有兩個字段。第一個字段表示當前該分支節點塊下面所鏈接的索引塊中所包含的最小鍵值;第二個字段爲四個字節,表示所鏈接的索引塊的地址,該地址指向下面一個索引塊。 在一個分支節點塊中 所能容納的記錄
行數由數據塊大小以及索引鍵值的長度決定。例如上圖的根節點解釋如下:
根節點包含5個索引條目(記錄),0、201…801爲這5個分支節點所鏈接的節點的最小值,B1、 B2…B5爲5個分支節點的地址。
D.對於葉子節點塊來說,其所包含的索引條目與分支節點一樣,都是按照順序排列的(缺省是升序排列,也可以在創建索引時指定爲降序排列)。每個索引條目(也可以叫做每條記錄)也具有兩個字段。第一個字段表示索引的鍵值,對於單列索引來說是一個值;而對於多列索引來說則是多個值組合在一起的。第二個字段表示鍵值所對應的記錄行的ROWID,該ROWID是記錄行在表裏的物理地址。 如果索引是創建在非分區表上或者索引是分區表上的本地索引的話,則該ROWID佔用6個字 節;如果索引是創建在分區表上的全局索引的話,則該ROWID佔用10個字節。
(2).索引大小的計算
默認的PCTFREE=10%,則代表可用空間爲90%;從9i開始,此90%也最多隻能使用87%,則不同大小數據塊能實際用來存放索引的數據的空間爲:
8k 8*1024*90%*87% ≈ 6414個字節
16k 16*1024*90%*87% ≈ 12828個字節
32k 16*1024*90%*87% ≈ 25657個字節
64k 64*1024*90%*87% ≈ 51314個字節
以上幾種塊是常用的幾種塊
A.葉子節點。 葉子節點中每個索引條目(記錄)都會在數據塊中佔一行空間。
B.分支節點。分支節點的一行中所存放的所鏈接的最小鍵值所需空間與上面所描述的葉子節點相同。
C.舉例
表account_trade的記錄數爲:1,546,240條,塊的大小爲64k,如果yhkh上建立一個非分區的索引,則:
a).一個數據塊可使用的字節數爲: 64*1024*90%*87% ≈ 51314個字節
b).葉子節點的大小爲:3+1+19+1+6=30 個字節
c).分支節點的大小爲: 3+1+19+1+4=28 個字節
d).一個葉子節點塊可存放的索引條目數(記錄數):51314/30 ≈ 1710
e). 1,546,240條記錄需要葉子節點塊數: 1546240/1710 ≈ 904
f).一個分支節點塊可存放的索引條目數(記錄數):51314/28 ≈ 1832
g).904個葉子節點需要的分支節點數爲:904/1832 = 1個
如果塊的大小爲8k,則:
a).一個數據塊可使用的字節數爲: 8*1024*90%*87% ≈ 6414個字節
b).葉子節點的大小爲:3+1+19+1+6=30 個字節
c).分支節點的大小爲: 3+1+19+1+4=28 個字節
d).一個葉子節點塊可存放的索引條目數(記錄數):6414/30 ≈ 213
e). 1,546,240條記錄需要葉子節點塊數: 1546240/213 ≈ 7260
f).一個分支節點塊可存放的索引條目數(記錄數):6414/28 ≈ 229
g).7260個葉子節點需要的分支節點數爲:7260/229 = 32個
l結果:索引有兩層,第一層有一個根節點和32個分支節點,葉子節點7260個
l注意:在 oracle 的索引中,層級號是倒過來的,也就是說假設某個索引有 N 層,則根節點的層級號爲 N ,而根節點下一層的分支節點的層級號爲 N-1 ,依此類推。對本例來說, 32 個分支節點所在的層級號爲 1 ,而根節點所在的層級號爲 2 。
(3).索引掃描
Oracle檢索一行數據時,通過索引來驅動,稱爲索引掃描。數據掃描索引值時,所發生的I/O的次數與b-tree樹索引的深度數相同。
如果檢索的列僅僅是包含在索引中的列,則Oracle會直接從索引中讀取,而不會從表中讀取;如果檢索的列包含除了索引中以外的列,則Oracle先從索引中讀取,然後使用從索引中拿到的rowid從表中讀取數據。因此, 典型的掃描方 式是從索引數據塊和表數據塊中交替讀取。
A.全索引掃描(full index scan、FIS)
全索引掃描只有在CBO(cost-based SQL optimizer)模式下才有效,當優化器認爲全索引掃描比全表掃描更有效時,才使用全索引掃描。此時,Oracle會讀取全部的索引。一般地,在WHERE子句中含有索引列時可能纔會發生全索引掃描,當然,有時在某些特殊情況下,沒有上述WHERE子句,也可能發生全索引掃描。
全索引掃描中會忽略掉排序,因爲此時讀取的數據已經是按照索引鍵值排序了。
A.全索引掃描(FIS)
全表掃描:
select jsbh from teachers where gzje > 3000
全索引掃描:
select jsbh from teachers where gzje > 3000 order by jsbh
B.快速全索引掃描(fast full index scan、FFIS)
快速全索引掃描僅僅檢索索引而不檢索表的一種全索引掃描方式,並且Oracle讀取索引塊時也不再具有特定的排序。
當同時滿足下列條件是,Oracle用FFIS替代FIS:
*.查詢的所有列均包含在索引中
*.查詢的結果集中沒有任何null值(一般是在WHERE子句中使用is not null或者使用not null約束來實現)
B.快速全索引掃描(fast full index scan、FFIS)
在表account_trade上建立一個b-tree索引,包含yhkh,jysj,則:
FFIS:
select a.yhkh,a.jysj from account_trade a order by a.yhkh;
全表掃描:
select a.yhkh,a.jysj from account_trade a
where a.jyje > 2000 order by a.yhkh;
C. 索引範圍掃描(index range scan)
索引範圍掃描是按順序的對某個索引進行掃描。當滿足下列條件時,會發生索引範圍掃描:
*.在唯一索引上使用範圍操作符(>、<、>=、<=、<>、BETWEEN)
select a.ckh,a.CKMC from course a where a.ckh > 'C005'
*.在組合索引上使用部分列進行查詢,導致查處多行
在表account_trade上建立一個b-tree索引,包含yhkh,jysj,jyje。
select a.yhkh,a.jysj from account_trade a
where a.yhkh = '6002780207313762981'
C. 索引範圍掃描(index range scan)
*.在非唯一索引列上進行的任何查詢
在表account_trade上建立一個b-tree索引,包含nd。
select * from account_trade a where a.nd = 2012;
select * from account_trade a where a.nd > 2012;
D. 索引唯一掃描 (index unique scan)
D. 索引唯一掃描 (index unique scan)
區別索引範圍掃描的是索引唯一掃描要麼返回0行數據要麼返回1行數據,不會返回多行數據。Oracle使用索引唯一掃描時,一旦發現時數據,則停止繼續掃描,因此效率很高。如果唯一索引是組合索引,則至少需要參與索引的列作爲引導列。
select * from productsale_singnle a
where a.sale_date = '20120103' and a.provice_name = '上海' and
a.city_name = ‘徐匯’ and a.product_name = ‘iPhone 4’ --索引唯一掃描
select * from productsale_singnle a
where a.sale_date = '20120103' and a.provice_name = '上海' and
a.city_name = ‘徐匯’ --索引範圍掃描
select a.ckh,a.CKMC from course a where a.ckh = 'C005‘--索引唯一掃描
E.索引跳躍式掃描 (index skip scan)
當表有一個複合索引,而在查詢中有除了索引中第一列的其他列作爲條件,並且優化器模式爲CBO,這時候查詢計劃就有可能使用到索引跳躍式掃描 。此外,還可以通過使用提示index_ss(CBO下)來強制使用索引跳躍式掃描。
索引跳躍式掃描是從9i開始新增的,但Oracle沒有公佈更多的官方的技術 細節,模擬此種索引跟多個條件相關。
(4).反轉鍵索引
反轉鍵索引就是將索引鍵的值反轉過來進行索引,索引的結構沒什麼變化,只是索引值的存儲方式相反的一種索引。例如一個索引的鍵是20,假如在標準的b-tree中存儲在該鍵中的兩個十六進制字節爲C1、15,則反轉鍵存儲的是15、C1。
Oracle中,對於長事務的大表、存在對相同的磁盤塊區重複讀寫的問題的,隨着時間的推移,此種I/O競爭會帶來越來越低的效率,如果數據以反轉鍵索引存儲,這些數據的值就會與原先存儲的數值相反,會有效改善這一問題。
反轉鍵索引不能對位圖索引和索引組織表進行反轉鍵處理,詳細情況請參閱Oracle官方文檔。
(5).升序及降序索引
Oracle默認的是升序索引,如果在列名後跟上DESC,則是對該列進行降序索引,降序索引在葉子節點中的存儲從左到右是按照從大到小排序的。按列指定降序和升序索引,在複合索引中往往比較有用。
例如將表account_trade上建立的一個b-tree索引修改成,包含yhkh ASC,jyje ASC,jysj DESC。 由於我們經常需要訪問的是最新的數據,故按交易 時間降序排列是有意義的。
2.bitmap索引
位圖索引適用於低基數(low-cardinality)列,所謂低基數列就是指這個列只有很少的可取值。不同於b-tree索引,位圖索引的一個鍵指向多行,可能數以百計甚至更多(b-tree索引一個鍵指向一行)。如果更新一個位圖索引鍵,那麼這個鍵指向的數百條記錄會與你實際更新的那一行一同被有效地鎖定。
位圖索引的適用場景:
*. 位圖索引是針對那些值不經常改變的字段的
*. 位圖索引是針對那些值不經常改變的字段的
*. 如果某個字段的值需要頻繁更新,那麼就不適合在它上面創建位圖索引。
(1).單表位圖索引
在列XB上建立一個位圖索引,其結構圖如下:
值
|
Row1
|
Row2
|
Row3
|
Row4
|
…
|
Row23
|
Row24
|
男
|
1
|
0
|
0
|
1
|
|
1
|
0
|
女
|
0
|
1
|
1
|
0
|
|
0
|
1
|
(2). 位圖連接索引
位圖連接索引是基於兩個或兩個以上數據表建立的一種位圖索引。對以一個表中某個列的每一個值,索引存儲了索引相應行的rowid在索引表中,而標準位圖索引是建立在單表上的。
位圖連接索引比位圖索引更進了一步。這些索引將位圖化的列完全從表數據中抽取出來,並將其存儲在索引中。其假定條件是這些列集合必須一起查詢。同樣的,這 也是爲數據倉庫數據庫而設計的。除了在句法最後有一個WHERE子句之外,位圖連接索引的創建指令就像創建位圖索引的CREATE BITMAP INDEX一樣。
位圖連接索引一般用於數據倉庫,請參閱oracle官方文檔。
3.基於函數的索引
如果對一個表的經常查詢的WHERE子句中包含基於列的函數或者表達式計算,則可以對該列建立基於函數的索引。函數索引能夠計算出函數或表達式的值,並將其保存在索引中。用戶創建的函數索引既可以是b-tree類型的,也可以是bitmap 類型的。
只有當查詢語句包含該函數或者表達式時,基於函數的索引纔會被調用。建立了基於函數的索引索引以後,執行INSERT或者UPDATE語句,數據庫同步也需要執行該索引的計算工作。
建設建立索引如下:
drop index idx_teachers_ngzje;
create index idx_teachers_ngzje on teachers(12 * gzje);
3.基於函數的索引
則:
select * from teachers where 12 * gzje < 20000 --調用基於函數的索引
select * from teachers where 6 * gzje < 10000 --全表掃描
select avg(12*gzje) from teachers --調用基於函數的索引
select avg(6*gzje) from teachers --全表掃描
可見Oracle優化器在SELECT子句或者WHERE子句中包含該函數或者表達式時會使用範圍索引掃描來調用該索引。
怎樣選擇索引(8建議)
1.由於唯一索引掃描效率最高,因此能使用唯一索引,儘量使用唯一索引;
2.對於取值基數較少的字段,如性別、狀態、Check項,儘量使用位圖索引;
3.由於NULL值在索引中沒有定義,因此建議儘量不要在允許NULL值的列上建立索引,雖然Oracle宣稱在允許NULL值的列上位圖索引,也是有效的,但我們依然強烈建議可以將null指定爲一個默認的值後再建立索引;
4.根據實際情況,一般對於列不超過10個,數據不超過1萬行的表不要建立索引,此種情況在應用中往往能佔40%以上;
5.一個表中不是建立的索引越多越好,相反過多的索引可能影響整體的性能,至少影響INSERT、DELETE和UPDATE的性能;
6.對於查詢中的WHERE子句經常需要使用多個AND條件一起使用時,應建立聯合索引,一般情況下,此種聯合索引是標示一行唯一記錄的,而主鍵使用代理主鍵,並且儘量將值少的列放在前面;
7.對於多表聯合查詢,及表連接的問題,對於連接的字段,需要建立索引;
8.平衡索引與更新的關係。如果一個大表的更新操作多於查詢操作,建議可以少建立索引;如果一個大表的查詢操作多於更新操作則可以考慮多使用索引。
索引之性能體驗和監測案例
1.Oracle Explain Plan結果中幾個重要名次解釋
(1)COST: Oracle依據其查詢優化器選擇的執行路徑估算的操作開銷(也稱爲成本、耗費)。開銷並不決定表的訪問操作,其值不具備任何特定的度量單位,僅僅代表該執行計劃的加權值,是通過IO_COST和CPU_COST計算得出的(oracle文檔中未公佈算法)。
(2)CPU_COST: 查詢優化器需要的CPU操作開銷估算值,其值與操作所需的機器運轉週期成正比。
(3)IO_COST:查詢優化器需要的IO操作開銷估算值,其值與讀取的數據塊成正比。
1.Oracle Explain Plan結果中幾個重要名次解釋
(4)CARDINALITY: 查詢優化器訪問的數據行的估算基數。
(5)TIME:查詢優化器消耗的時間估算值(單位爲秒)。
2.刪除索引
將表account_trade上的所有索引均刪除掉
3.性能監測體驗
使用SQL語句
3.性能監測體驗--使用SQL語句
l開銷降低47%、執行時間提高31%
l此外還有多種查看方式:SQL窗口查詢、PL/SQL DEVELPOER 解釋計劃窗口、通過toad查看等
何時需要重建索引
1.葉子節點中浪費的空間大於20%時
lanalyze index IDX_ACCOUNT_TRADE_YHKH validate structure;
lselect a.name,(a.del_lf_rows_len/a.lf_rows_len) * 100 from index_stats a
其中del_lf_rows_len是葉子節點中被刪除的行數; lf_rows_len是葉子節點的行數
lalter index IDX_ACCOUNT_TRADE_YHKH rebuild或者刪除該索引再創建
2.監視索引的使用情況,對從來沒使用的索引進行刪除
性能優化更多的高級內容超出了本課範圍,請參見oracle官方文檔
要點及習題
1.使用索引的優點和缺點分別包括哪些?
2.分別繪圖說明b-tree索引和bitmap索引,並解釋其存儲結構,重點要求闡述清楚b-tree索引兩種節點的存儲單元和構成以及bitmap索引適用的情況。
3.結合第2題的理論,舉例說明表productsale_star如果有10萬行記錄,其索引PK_productsale_start的存儲大小估算是多少?
4.解釋oracle查詢數據時,一般有幾種掃描方式,爲什麼在大表中要避免全表掃描,而在小表中儘量少使用索引?
5.降序索引和基於函數的函數索引各有什麼好處,分別在什麼情況下才適合使用?
6.推薦的索引使用方式主要包括哪些(要求至少要回答出5種情況)。
7.在實踐中,對索引的監測主要使用的是EXPLAIN PLAN,那麼監測的重點是什麼?
8.什麼情況下一般要求重建索引,怎麼重建?