SQL優化之不“畫蛇添足”
本文轉載自微信公眾號「SQL數據庫開發」,作者 丶平凡世界 。轉載本文請聯系SQL數據庫開發公眾號。
SQL優化的方法有很多,今天給大家介紹一下兩個簡單但非常實用的方法:不查詢多余的行和列。很多小伙伴可能都知道這兩個方法,但是為什么這么做可能還是不太清楚,下面就讓我們看相關示例來給大家具體解釋一下。
1、不查多余的列
查詢過程中經常為了省事,而直接使用*來代替所有的列,好處是不需要寫明列。壞處就是遇到列比較多的表查詢效率就大大折扣了。例如:
- SELECT * FROM [Sales].[SalesOrderDetail];
我們執行一下可以看到如下信息:
Q:上面的消息界面是怎么出來的呢?
A:點擊菜單欄的查詢——查詢選項...——高級,將SET STATISTICS TIME和SET STATISTICS IO都勾選上就可以了
上面的相關信息我給大家解讀一下:
掃描計數:索引或表掃描次數
邏輯讀?。簲祿彺嬷凶x取的頁數
物理讀取:從磁盤中讀取的頁數
預讀:查詢過程中,從磁盤放入緩存的頁數
lob邏輯讀取:從數據緩存中讀取,image,text,ntext或大型數據的頁數
lob物理讀取:從磁盤中讀取,image,text,ntext或大型數據的頁數
lob預讀:查詢過程中,從磁盤放入緩存的image,text,ntext或大型數據的頁數
語句的CPU時間分編譯階段和執行階段。
CPU時間是指:執行語句的時間
占用時間是指:從磁盤讀取數據再處理總的使用時間
編譯階段:
SQL Server 分析和編譯時間:
執行階段:
SQL Server 執行時間:
這些信息我們以后都會經常看到的,這是判斷一個查詢語句最直觀的方式。
我們再單獨查詢一列看會怎么樣?例如:
- SELECT UnitPrice FROM [Sales].[SalesOrderDetail];
我們執行一下可以看到如下信息:
通過上面的時間對比我們就可以清楚的看到:將列名明確的列出,不顯示不相關的列效率有很大的提升。
這里就是大家經??吹降囊粭l優化建議:不要直接使用*進行查詢,而只查詢需要的列。
當然如果本身有需要查看全表內容,就不在此條優化之列了。
2、不查多余的行
- 在查詢的時候使用WHERE關鍵字可以很好的過濾掉不需要的行。這也是提高查詢效率的一種方式,其實這才是WHERE關鍵字存在的意義。
例如:
- SELECT UnitPrice FROM [Sales].[SalesOrderDetail] WHERE UnitPrice>1000;
我們執行一下可以看到如下信息:
所占用的時間成倍的減少,效果顯而易見。
- 使用DISTINCT關鍵字減少多余重復的行。
例如:
- SELECT DISTINCT UnitPrice
- FROM [Sales].[SalesOrderDetail]
- WHERE UnitPrice>1000;
我們執行一下可以看到如下信息:
我們發現,在某些情況下DISTINCT也可以加快數據的查詢效率。