Oracle 10g sql優(yōu)化之索引篇
網(wǎng)站速度變慢時(shí),你會(huì)考慮到什么解決方法?筆者最近公司網(wǎng)站的速度一起很不理想,文章頁(yè)面基本都要 10s 以上才能打開。數(shù)據(jù)庫(kù)用的是 Oracle 10g Express Edtion,存放文章的表超過(guò)了 10 萬(wàn)數(shù)據(jù)量,類似執(zhí)行一個(gè) select count(1) from res where class_id=1 這樣的語(yǔ)句就經(jīng)常在 10s 以上。然而,今天我在 class_id 上加了一個(gè)索引,這條語(yǔ)句的執(zhí)行時(shí)間就幾乎變成了 0s。效果之顯著,完全出乎我的預(yù)料。下面是Oracle 10g sql優(yōu)化相關(guān)的總結(jié):
1. 監(jiān)控 select 語(yǔ)句
(“數(shù)據(jù)庫(kù)主頁(yè)”從開始菜單里“Oracle Database 10g Express Edition”的“轉(zhuǎn)至數(shù)據(jù)庫(kù)主頁(yè)”進(jìn)入)
進(jìn)入“數(shù)據(jù)庫(kù)主頁(yè)>管理>數(shù)據(jù)庫(kù)監(jiān)視器>會(huì)話>SQL”頁(yè)面,在“搜索”里輸入“select”,點(diǎn)擊“開始”。 這樣就可以看到最近執(zhí)行的 select 語(yǔ)句。點(diǎn)擊“SQL”列里的 SQL 語(yǔ)句鏈接,查看執(zhí)行情況。其中,“CPU時(shí)間”即為執(zhí)行所用的時(shí)間,“已處理的行數(shù)”為查詢結(jié)果的行數(shù)。下面的“SQL文本”是 SQL 語(yǔ)句的完整內(nèi)容,“索引”區(qū)域顯示該查詢使用了哪個(gè)索引。
找到“CUP時(shí)間”超過(guò) 1 秒的查詢,看是否需要添加索引。
2. 添加索引
進(jìn)入“數(shù)據(jù)庫(kù)主頁(yè)>對(duì)象瀏覽器”頁(yè)面,在右邊偏上方有一個(gè)“創(chuàng)建”按鈕。點(diǎn)擊“創(chuàng)建” 按鈕,在出現(xiàn)的菜單里選擇“索引”,然后輸入“表名”,“索引類型”使用“常規(guī)”,再點(diǎn)擊“下一步”。
在新出現(xiàn)的頁(yè)面,輸入索引的名稱和索引列。如果是不唯一的字段,***將“單性值”設(shè)置為唯一,可能有助提高檢索速度。再點(diǎn)擊“下一步”,點(diǎn)擊“完成”按鈕。
照我的理解,創(chuàng)建索引時(shí)選擇什么索引列,應(yīng)該是由 select 語(yǔ)句的 where 部分決定的。比如 where id=1 ,只需選擇 id 一個(gè)索引列;如果是 where id=1 and name=2 ,則需要選擇 id 和 name 兩個(gè)索引列來(lái)創(chuàng)建索引。只對(duì)主鍵進(jìn)行索引,因?yàn)槭俏ㄒ坏?,所以將“單性值”設(shè)置為“唯一”。
數(shù)據(jù)量比較大的表,都應(yīng)在其主鍵上創(chuàng)建一個(gè)索引,其它需要的另加。
order by 語(yǔ)句里的字段,一般無(wú)法使用索引,所以,盡量在 order by 之前將查詢結(jié)果的行數(shù)縮到最少。
要提高 order by 語(yǔ)句的執(zhí)行效率,可適當(dāng)增加 sort_area_size 的值( 10240000=10m ):
- alter system set sort_area_size=10240000 scope=spfile;
這樣就實(shí)現(xiàn)了Oracle 10g sql優(yōu)化的索引優(yōu)化。
附一:為表添加主鍵
進(jìn)入“數(shù)據(jù)庫(kù)主頁(yè)>對(duì)象瀏覽器”頁(yè)面,在左則選擇要?jiǎng)?chuàng)建主鍵的表。在右邊出現(xiàn)的表頁(yè)面中,點(diǎn)擊“約束條件”->“創(chuàng)建”,“約束條件類型”設(shè)置為“主鍵”,其它自行填寫。
附二:Oracle 配置參數(shù)查詢語(yǔ)句
- SELECT NAME,VALUE
- FROM v$parameter
- WHERE NAME IN
- (’sga_max_size’,'db_cache_size’,
- ’shared_pool_size’,’shared_pool_reserved_size’,'large_pool_size’,'java_pool_size’,
- ‘db_block_size’,'db_block_buffers’,'log_buffer’,’sort_area_size’,’sort_area_retained_size’,
- ‘hash_area_size’,’sessions’,'open_cursors’
- )ORDER BY NAME;
附三:其它參數(shù)設(shè)置命令
- alter system set sga_max_size=700m scope=spfile;
- alter system set sga_target=700m scope=spfile;
【編輯推薦】
- 淺談Oracle優(yōu)化排序的操作
- Oracle使用hash分區(qū)優(yōu)化分析函數(shù)查詢
- 善用Oracle表空間設(shè)計(jì)提升數(shù)據(jù)庫(kù)性能
- 優(yōu)化數(shù)據(jù)庫(kù)大幅度提高Oracle的性能
- Oracle設(shè)置系統(tǒng)參數(shù)進(jìn)行性能優(yōu)化