设计高效sql一般经验谈
1不用在sql語句使用系統默認的保留關鍵字
2盡量用exists 和 not exists 代替 in 和 not in
???????? 這條在sql2005之后,在索引一樣,統計信息一樣的情況下,exists ,in效果是一樣的。
???????? 以AdventureWorks數據庫為例,查詢在HumanResources.EmployeeAddress有地址的Employee信息,
用in 語句如下:
SET STATISTICS IO ON
?
SELECT * FROM HumanResources.Employee
WHERE EmployeeID IN (SELECT EmployeeID FROM HumanResources.EmployeeAddress ea)
?
SET STATISTICS IO OFF
執行后,消息如下:
?
(290 行受影響)
表'EmployeeAddress'。掃描計數1,邏輯讀取4 次,物理讀取0 次,預讀0 次,lob 邏輯讀取0 次,lob 物理讀取0 次,lob 預讀0 次。
表'Employee'。掃描計數1,邏輯讀取9 次,物理讀取0 次,預讀0 次,lob 邏輯讀取0 次,lob 物理讀取0 次,lob 預讀0 次。
執行計劃如圖
?
用exists ,語句如下,
?
SET STATISTICS IO ON
SELECT * FROM HumanResources.Employee
WHERE EXISTS(SELECT EmployeeID FROM?HumanResources.EmployeeAddress ea
???????????? WHERE
?????????? HumanResources.Employee.EmployeeID=ea.EmployeeID)
??????????
?
SET STATISTICS IO OFF
執行后,消息如下:
?
(290 行受影響)
表'EmployeeAddress'。掃描計數1,邏輯讀取4 次,物理讀取0 次,預讀0 次,lob 邏輯讀取0 次,lob 物理讀取0 次,lob 預讀0 次。
表'Employee'。掃描計數1,邏輯讀取9 次,物理讀取0 次,預讀0 次,lob 邏輯讀取0 次,lob 物理讀取0 次,lob 預讀0 次。
執行計劃如圖:
?
3盡量不用select * from …..,而要寫字段名 select field1,field2,…
???????? 這條沒什么好說的,主要是按需查詢,不要返回不必要的列和行。
?
4在sql 查詢中應盡量使用索引列來加快查詢速度
5任何在Order by 語句的非索引項或者有計算表達式都將降低查詢速度
6任何在where子句中使用is null 或 is not null 的語句不允許使用索引,效率較低
7通配符%在詞首時,系統不使用索引,當通配符出現在其他位置時,優化器就能利用索引
????????
8在海量數據的sql查詢語句中盡量少用格式轉換
9任何對列的操作都將導致表掃描,它包括數據庫函數、計算表達式等,查詢時要盡可能將操作移至等號右邊
10 In 、or子句常會使索引失效
11通常情況下,連接比子查詢效率要高
?
轉載于:https://www.cnblogs.com/kevinlzf/archive/2009/10/28/1591212.html
總結
以上是生活随笔為你收集整理的设计高效sql一般经验谈的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sql2005新增排序方法
- 下一篇: 在线网摘收藏?让Google来吧!