昨天在做一个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: 因为我虽然我毕业的大学不算差,可是实际编程的时间不长,所以很多东西都是接触不深,谨此来记录一下我的编程路上觉得需要记的东西,不一定对大家有用,但是希望能作为对自己的勉励吧,愿生活一切安好。