大表的select操作1、首先建立索引,考慮實際用途最好建立組合索引當任何單個查詢要檢索的行少于或者等于整個表行數的10%時,索引就非常有用。當業務需要檢索表中數據超過25%,索引意義不大普通索引create index idx_t_normalid on t(object_id)唯一索引(索引列非空則唯一,比普通索引占用空間小一點)create unique index idx_t_uniid on t(object_id)復合索引(查詢時按索引的順序加入條件object_id,object_name或object_id)create index idx_t_normalid on t(object_id,object_name);2、使用中間表如人員明細表,可建立地域、時間人員數量表作為中間表以查詢人數注意:對明細表進行更改是也要對中間表相應字段進行更改3、水平拆表如果表中的數據呈現出某一類特性,比如呈現時間特性,那么可以根據時間段將表拆分成多個。4、垂直拆表將表按字段拆分成多個表,常用的字段放在一個表,不常用的字段或大字段放在另外一個表5、索引優化(1)索引不存儲為NULL的列(2)避免通配符(%)在搜尋詞首出現,如必須可使用 reverse函數(3)避免對索引列進行類型轉換(4)避免對索引列進行函數運算,如必須可建立函數索引(5)避免索引列使用 <>,!=,NOT IN,NOT EXISTS,可使用< OR > 來避免
(6)頻繁進行刪除操作的被索引的表,應當階段性地重建索引,以避免在索引中造成空間碎片,影響性能.在許可的條件下,也可以階段性地truncate表,truncate命令刪除表中所有記錄,也刪除索引碎片.
6、sql優化盡量使用 JOIN 進行表的連接,永遠不要在 FROM 后面使用逗號連接表
order by 非索引字段或者有計算表達式都將降低查詢速度
避免使用HAVING子句,可用where代替
EXISTS替代IN、用NOT EXISTS替代NOT IN
sql語句用大寫的;因為Oracle總是先解析sql語句,把小寫的字母轉換成大寫的再執行
不要使用游標 !!
7、優化GROUP BY
將不需要的記錄在GROUP BY 之前過濾掉
8、 用內存緩存數據,以空間換時間、將常用而且不常修改的數據加載到內存中,直接從內存查詢則可。