SQL点滴之with语句和子查询的性能比较

之前笔者和大家分享了《使用with语句来写一个稍微复杂sql语句》,这一次笔者针对with语句和子查询做了一个性能的比较。

成都创新互联公司是一家专业提供梅里斯企业网站建设,专注与网站建设、成都网站建设、H5技术、小程序制作等业务。10年已为梅里斯众多企业、政府机构等服务。创新互联专业网站设计公司优惠进行中。

在博友SingleCat的提醒下,对with语句做一些性能测试,这里使用的测试工具是SQL Server Profile。我选择了***一个语句,因为这个语句比较复杂一点。开始的时候单独执行一次发现他们的差别不大,就差几个毫秒,后来想让他们多执行几次,连续执行10

次看看执行的结果。下面贴出测试用的语句。

 
 
 
 
  1. /*with查询*/
  2. declare @withquery varchar(5000)
  3. declare @execcount int=0
  4. set @withquery='with TheseEmployees as(
  5. select empid from hr.employees where country=N''USA''),
  6. CharacteristicFunctions as(
  7. select custid,
  8.        case when custid in (select custid from sales.orders as o where o.empid=e.empid) then 1 else 0 end as charfun
  9. from sales.customers as c cross join TheseEmployees as e)
  10. select custid from CharacteristicFunctions group by custid having min(charfun)=1 order by custid
  11. '
  12. while @execcount<10
  13. begin
  14. exec (@withquery);
  15. set @execcount=@execcount+1
  16. end
  17. /*子查询*/
  18. declare @subquery varchar(5000)
  19. declare @execcount int=0
  20. set @subquery='select custid from Sales.Orders where empid in
  21. (select empid from HR.Employees where country = N''USA'') group by custid
  22. having count(distinct empid)=(select count(*) from HR.Employees where country = N''USA'');
  23. '
  24. while @execcount<10
  25. begin
  26. exec (@subquery);
  27. set @execcount=@execcount+1
  28. end

从SQL Server Profile中截图如下

从图中可以看到子查询语句的执行时间要少于with语句,我觉得主要是with查询中有一个cross join做了笛卡尔积的关系,于是又实验了上面的那个简单一点的,下面是测试语句。

 
 
 
 
  1. /*with语句*/
  2. declare @withquery varchar(5000)
  3. declare @execcount int=0
  4. set @withquery='with c(orderyear,custid) as(
  5. select YEAR(orderdate),custid from sales.orders)
  6. select orderyear,COUNT(distinct(custid)) numCusts from c group by c.orderyear' 
  7. while @execcount<100
  8. begin
  9. exec (@withquery);
  10. set @execcount=@execcount+1
  11. end
  12. /*子查询*/
  13. declare @subquery varchar(5000)
  14. declare @execcount int=0
  15. set @subquery='select orderyear,COUNT(distinct(custid)) numCusts
  16. from (select YEAR(orderdate),custid from sales.orders) as D(orderyear,custid)
  17. group by orderyear'
  18. while @execcount<100
  19. begin
  20. exec (@subquery);
  21. set @execcount=@execcount+1
  22. end

这次做10次查询还是没有多大的差距,with语句用10个duration,子查询用了11个,有时候还会翻过来。于是把执行次数改成100,这次还是子查询使用的时间要少,截图如下

最终结论,子查询好比with语句效率高。

当前文章:SQL点滴之with语句和子查询的性能比较
路径分享:http://www.shufengxianlan.com/qtweb/news47/518297.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联