一些常見的SQL效能問題

原创 2010年03月02日 11:26:00

1.      對查詢進行優化,應儘量避免全表掃描,首先應考慮在 where order by 涉及的列上建立索引。

 

2.      應儘量避免在 where 子句中對欄位進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃描,如:
  select id from t where num is null
  可以在num上設置預設值0,確保表中num列沒有null值,然後這樣查詢:
  select id from t where num=0

 

3.      應儘量避免在 where 子句中使用!=<>操作符,否則將使引擎放棄使用索引而進行全表掃描。

 

4.      應儘量避免在 where 子句中使用 or 來連接條件,否則將導致引擎放棄使用索引而進行全表掃描,如:
select id from t where num=10 or num=20
可以這樣查詢:
select id from t where num=10
union all
select id from t where num=20

 

5.      in not in 也要慎用,否則會導致全表掃描,如:
select id from t where num in(1,2,3)
對於連續的數值,能用 between 就不要用 in 了:
select id from t where num between 1 and 3

 

6.      下面的查詢也將導致全表掃描:
select id from t where name like 'abc'
若要提高效率,可以考慮全文檢索。

 

7.      應儘量避免在 where 子句中對欄位進行運算式操作,這將導致引擎放棄使用索引而進行全表掃描。如:
select id from t where num/2=100
應改為:
select id from t where num=100*2

 

8.      應儘量避免在where子句中對欄位進行函數操作,這將導致引擎放棄使用索引而進行全表掃描。如:
select id from t where substring(name,1,3)='abc'--name
abc開頭的id
select id from t where datediff(day,createdate,'2005-11-30')=0--‘2005-11-30’
生成  的id應改為:
select id from t where name like 'abc'
select id from t where createdate>='2005-11-30' and createdate<'2005-12-1'

 

9.      不要在 where 子句中的“=”左邊進行函數、算術運算或其他運算式運算,否則系統將可能無法正確使用索引。

 

10.  在使用索引欄位作為條件時,如果該索引是複合索引,那麼必須使用到該索引中的第一個欄位作為條件時才能保證系統使用該索引,否則該索引將不會被使用,並且應盡可能的讓欄位順序與索引順序相一致。

 

11.  很多時候用 exists 代替 in 是一個好的選擇:
select num from a where num in(select num from b)
用下面的語句替換:
select num from a where exists(select 1 from b where num=a.num)

 

12.  並不是所有索引對查詢都有效,SQL是根據表中資料來進行查詢優化的,當索引列有大量資料重複時,SQL查詢可能不會去利用索引,如一表中有欄位sexmalefemale幾乎各一半,那麼即使在sex上建了索引也對查詢效率起不了作用。

 

13.  索引並不是越多越好,索引固然可以提高相應的 select 的效率,但同時也降低了 insert update 的效率,因為 insert update 時有可能會重建索引,所以怎樣建索引需要慎重考慮,視具體情況而定。一個表的索引數最好不要超過6個,若太多則應考慮一些不常使用到的列上建的索引是否有 必要。

 

14.  應盡可能的避免更新 clustered 索引資料列,因為 clustered 索引資料列的順序就是表記錄的物理存儲順序,一旦該列值改變將導致整個表記錄的順序的調整,會耗費相當大的資源。若應用系統需要頻繁更新 clustered 索引資料列,那麼需要考慮是否應將該索引建為 clustered 索引。

 

15.  儘量使用數字型欄位,若只含數值資訊的欄位儘量不要設計為字元型,這會降低查詢和連接的性能,並會增加存儲開銷。這是因為引擎在處理查詢和連接時會逐個比較字串中每一個字元,而對於數字型而言只需要比較一次就夠了。

 

16.  盡可能的使用 varchar/nvarchar 代替 char/nchar ,因為首先變長欄位存儲空間小,可以節省存儲空間,其次對於查詢來說,在一個相對較小的欄位內搜索效率顯然要高些。

 

17.  盡量不要用 select * from t ,用具體的欄位列表代替“*”,不要返回用不到的任何欄位。

sqlserver视图查询效率测试

测试视图的查询效率,结果清晰表示视图不降低查询效率。
  • wanmdb
  • wanmdb
  • 2015年12月19日 15:23
  • 3508

MySQL查看SQL语句执行效率和mysql几种性能测试的工具

Explain命令在解决数据库性能上是第一推荐使用命令,大部分的性能问题可以通过此命令来简单的解决,Explain可以用来查看 SQL 语句的执行效 果,可以帮助选择更好的索引和优化查询语句,写出更好...
  • chengxuyuanyonghu
  • chengxuyuanyonghu
  • 2017年03月11日 22:18
  • 5967

sql语句中条件查询like的效率,及使用规范.

引用“ 我在做数据库查询的时候,发现了一个奇怪的问题,在使用like关键字的时候,速度其慢,效率极低。不明白是什么原因,请大家讲解一下,为什么like慢,而其他的两个快。3个查询不同的地方用红色...
  • z69183787
  • z69183787
  • 2013年08月29日 13:37
  • 5823

安装SQL Server 2008 步骤及常见安装问题

  • 2017年08月18日 10:03
  • 1.36MB
  • 下载

sql server 常见安装问题总结

  • 2011年10月09日 22:56
  • 1.17MB
  • 下载

安装SQL2008常见问题及解决方法

  • 2015年03月30日 22:09
  • 197KB
  • 下载

SQL2005安装及常见问题解决方法

  • 2013年01月20日 22:40
  • 916KB
  • 下载

sql常见问题

  • 2014年03月24日 15:31
  • 436KB
  • 下载

sql server 安装和卸载、常见问题及处理方法

  • 2012年09月27日 20:36
  • 1.14MB
  • 下载

多种典型T-SQL语句、备份、优化、常见问题处理集合包

  • 2013年05月08日 11:32
  • 1024KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:一些常見的SQL效能問題
举报原因:
原因补充:

(最多只允许输入30个字)