昨天在做一個sql代碼查詢的問題,發現了一些可優化的東西,藉此記錄一下。1,善用with as之前在寫sql 分頁查詢的時候,就只是用嵌套查詢,然後一個普通的關聯幾個表查詢,例如:SELECT * FROM( SELECT TOP 100 lr.SKU,lr.ItemPrice,lr.La...
昨天在做一個sql代碼查詢的問題,發現了一些可優化的東西,藉此記錄一下。
1,善用with as
之前在寫sql 分頁查詢的時候,就只是用嵌套查詢,然後一個普通的關聯幾個表查詢,例如:
SELECT * FROM(
SELECT TOP 100 lr.SKU,lr.ItemPrice,lr.LazadaID,ROW_NUMBER() OVER (ORDER BY lr.PrimaryID) AS Row_ID
FROM OpenData..LazadaRefund(NOLOCK) AS lr
INNER JOIN OpenData..eBay(NOLOCK) AS e ON e.eBayID = lr.LazadaID
INNER JOIN 其他表
LEFT JOIN 其他表
WHERE 條件
) AS temp
WHERE temp.Row_ID >0 AND temp.Row_ID <= 100
後來發現,隨著增加的表越多,這種嵌套的子查詢已經越來越慢,特別是關聯了一兩千萬條數據的時候,無論是否加了索引,都查詢很慢,後來就嘗試使用了 with as ,暫且叫他遞歸查詢吧。。。。
修改瞭如下:
WITH T AS (
SELECT TOP 100 * FROM(
SELECT lr.PrimaryID,ROW_NUMBER() OVER ( ORDER BY lr.PrimaryID) AS Row_ID
FROM OpenData..LazadaRefund(NOLOCK) AS lr
INNER JOIN OpenData..eBay(NOLOCK) e ON e.eBayID = lr.LazadaID
--根據所選的查詢條件來關聯某些表
) AS temp
WHERE temp.Row_ID >0 AND temp.Row_ID <= 100
)
SELECT lr.SKU,lr.ItemPrice,lr.LazadaID,la.SellerSKU
FROM T AS t
INNER JOIN OpenData..LazadaRefund(NOLOCK) AS lr ON lr.PrimaryID = t.PrimaryID
LEFT JOIN OpenData..LazadaListing(NOLOCK) AS la ON la.LazadaID = lr.LazadaID
--前面的select需要顯示什麼就關聯什麼表
--INNER JOIN ...
--LEFT JOIN ...
發現,隨著數據越來越複雜,下麵的查詢遠比第一條數據快得多,記得有一次查詢用了一分多鐘才查出來,後來直接就變成20秒不到
2,用一下臨時表
如果有些語句你放在子查詢覺得慢,不妨試試弄一個臨時表,然後再關聯一下這個臨時表就好了
3,用union all 好過 union, 具體我沒怎麼測試過,不過確實是這樣的。。。。
4,
這東西我也是第一次用,對優化你的sql代碼是有幫助的,我相信dba很多時候都用到吧
ps: 因為我雖然我畢業的大學不算差,可是實際編程的時間不長,所以很多東西都是接觸不深,謹此來記錄一下我的編程路上覺得需要記的東西,不一定對大家有用,但是希望能作為對自己的勉勵吧,願生活一切安好。