SQL高效查詢建議,你學會了嗎?
為什么別人的查詢只要幾秒,而你的查詢語句少則十多秒,多則十幾分鐘甚至幾個小時?與你的查詢語句是否高效有很大關系。
今天我們來看看如何寫出比較高效的查詢語句。
1.盡量不要使用NULL當默認值
在有索引的列上如果存在NULL值會使得索引失效,降低查詢速度,該如何優化呢?例如:
SELECT * FROM [Sales].[Temp_SalesOrder] WHERE UnitPrice IS NULL
我們可以將NULL的值設置成0或其他固定數值,這樣保證索引能夠繼續有效。
SELECT * FROM [Sales].[Temp_SalesOrder] WHERE UnitPrice =0
這是改寫后的查詢語句,效率會比上面的快很多。
2.盡量不要在WHERE條件語句中使用!=或<>
在WHERE語句中使用!=或<>也會使得索引失效,進而進行全表掃描,這樣就會花費較長時間了。
3.應盡量避免在 WHERE子句中使用 OR
遇到有OR的情況,我們可以將OR使用UNION ALL來進行改寫
例如:
SELECT * FROM T1 WHERE NUM=10 OR NUM=20
可以改寫成
SELECT * FROM T1 WHERE NUM=10
UNION ALL
SELECT * FROM T1 WHERE NUM=20
4.IN和NOT IN也要慎用
遇到連續確切值的時候 ,我們可以使用BETWEEN AND來進行優化
例如:
SELECT * FROM T1 WHERE NUM IN (5,6,7,8)
可以改寫成:
SELECT * FROM T1 WHERE NUM BETWEEN 5 AND 8.
5.子查詢中的IN可以使用EXISTS來代替
子查詢中經常會使用到IN,如果換成EXISTS做關聯查詢會更快
例如:
SELECT * FROM T1 WHERE ORDER_ID IN (SELECT ORDER_ID FROM ORDER WHERE PRICE>20);
可以改寫成:
SELECT * FROM T1 AS A WHERE EXISTS (SELECT 1 FROM ORDER AS B WHERE A.ORDER_ID=B.ORDER_ID AND B.PRICE>20)
雖然代碼量可能比上面的多一點,但是在使用效果上會優于上面的查詢語句。
6.模糊匹配盡量使用前綴匹配
在進行模糊查詢,使用LIKE時盡量使用前綴匹配,這樣會走索引,減少查詢時間。
例如:
SELECT * FROM T1 WHERE NAME LIKE '%李四%'
或者
SELECT * FROM T1 WHERE NAME LIKE '%李四'
均不會走索引,只有當如下情況
SELECT * FROM T1 WHERE NAME LIKE '李四%'才會走索引。
上述這些都是平常經常會遇到的,就直接告訴大家怎么操作了,具體可以下去做試驗嘗試一下。