網站速度變慢時,你會考慮到什麼解決方法?筆者最近公司網站的速度一起很不理想,文章頁面基本都要 10s 以上才能打開。數據庫用的是 Oracle 10g Express Edtion,存放文章的表超過了 10 萬數據量,類似執行一個 select count(1) from res where class_id=1 這樣的語句就經常在 10s 以上。然而,今天我在 class_id 上加了一個索引,這條語句的執行時間就幾乎變成了 0s。效果之顯著,完全出乎我的預料。下面是Oracle 10g sql優化相關的總結:
1. 監控 select 語句
(“數據庫主頁”從開始菜單裡“Oracle Database 10g Express Edition”的“轉至數據庫主頁”進入)
進入“數據庫主頁>管理>數據庫監視器>會話>SQL”頁面,在“搜索”裡輸入“select”,點擊“開始”。 這樣就可以看到最近執行的 select 語句。點擊“SQL”列裡的 SQL 語句鏈接,查看執行情況。其中,“CPU時間”即為執行所用的時間,“已處理的行數”為查詢結果的行數。下面的“SQL文本”是 SQL 語句的完整內容,“索引”區域顯示該查詢使用了哪個索引。
找到“CUP時間”超過 1 秒的查詢,看是否需要添加索引。
2. 添加索引
進入“數據庫主頁>對象浏覽器”頁面,在右邊偏上方有一個“創建”按鈕。點擊“創建” 按鈕,在出現的菜單裡選擇“索引”,然後輸入“表名”,“索引類型”使用“常規”,再點擊“下一步”。
在新出現的頁面,輸入索引的名稱和索引列。如果是不唯一的字段,最好將“單性值”設置為唯一,可能有助提高檢索速度。再點擊“下一步”,點擊“完成”按鈕。
照我的理解,創建索引時選擇什麼索引列,應該是由 select 語句的 where 部分決定的。比如 where id=1 ,只需選擇 id 一個索引列;如果是 where id=1 and name=2 ,則需要選擇 id 和 name 兩個索引列來創建索引。只對主鍵進行索引,因為是唯一的,所以將“單性值”設置為“唯一”。
數據量比較大的表,都應在其主鍵上創建一個索引,其它需要的另加。
order by 語句裡的字段,一般無法使用索引,所以,盡量在 order by 之前將查詢結果的行數縮到最少。
要提高 order by 語句的執行效率,可適當增加 sort_area_size 的值( 10240000=10m ):
- alter system set sort_area_size=10240000 scope=spfile;
這樣就實現了Oracle 10g sql優化的索引優化。
附一:為表添加主鍵
進入“數據庫主頁>對象浏覽器”頁面,在左則選擇要創建主鍵的表。在右邊出現的表頁面中,點擊“約束條件”->“創建”,“約束條件類型”設置為“主鍵”,其它自行填寫。
附二:Oracle 配置參數查詢語句
- 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;
附三:其它參數設置命令
- alter system set sga_max_size=700m scope=spfile;
- alter system set sga_target=700m scope=spfile;