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