你的位置:首页 > 数据库

[数据库]浅谈一下sql 查询语句的一些问题和优化


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