基本原則
- 避免全表掃描
- 建立索引
- 盡量避免向客戶端返回大數據量,若數據量過大,應該考慮相應需求是否合理
- 盡量避免大事務操作,提高系統並發能力
- 使用基於游標的方法或臨時表方法之前,應先尋找基於集的解決方案來解決問題,基於集的方法通常更有效。盡量避免使用游標,因為游標的效率較差。
where 后的條件
- 應盡量避免在 where 子句中使用 != 或 <> 操作符,否則將引擎放棄使用索引而進行全表掃描。
- 應盡量避免在 where 子句中使用 or 來連接條件,可以考慮使用union 代替
- in 和 not in 也要慎用,對於連續的數值,能用 between 就不要用 in,exists 代替 in
- 盡量避免在 where 子句中對字段進行表達式操作和函數操作
數據類型
- 盡量使用數字型字段,若只含數值信息的字段盡量不要設計為字符型,這會降低查詢和連接的性能,並會增加存儲開銷。
- 盡可能的使用 varchar/nvarchar 代替 char/nchar ,因為變長字段存儲空間小,對於查詢來說,在一個相對較小的字段內搜索效率顯然要高些。
- 最好不要給數據庫留NULL,盡可能的使用 NOT NULL填充數據庫.備注、描述、評論之類的可以設置為 NULL,其他的,最好不要使用NULL。
- 任何地方都不要使用
select * from t,用具體的字段列表代替“*”,不要返回用不到的任何字段。
臨時表
- 避免頻繁創建和刪除臨時表,以減少系統表資源的消耗。對於一次性事件, 最好使用導出表。
- 在新建臨時表時,如果一次性插入數據量很大,那么可以使用 select into 代替 create table,避免造成大量 log ,以提高速度;如果數據量不大,為了緩和系統表的資源,應先create table,然后insert。
- 如果使用到了臨時表,在最后將所有的臨時表顯式刪除時,先 truncate table ,然后 drop table ,這樣可以避免系統表的較長時間鎖定。
索引
- 先應考慮在 where 及 order by 涉及的列上建立索引。
- 在使用索引字段作為條件時,如果該索引是復合索引,那么必須使用到該索引中的第一個字段作為條件 時才能保證系統使用該索引, 否則該索引將不會 被使用, 並且應盡可能的讓字段順序與索引順序相一致。
- 索引並不是越多越好,索引固然可以提高相應的 select 的效率,但同時也降低了 insert和update 的效率,因為 insert 或 update 時有可能會重建索引,所以視具體情況而定。一個表的索引數最好不要超過7個,若太多則應考慮一些不常使用到的列上建的索引是否有必要.
