程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> SQL點滴之with語句和子查詢的性能比較

SQL點滴之with語句和子查詢的性能比較

編輯:關於SqlServer
 

在博友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)
  9. then 1 else 0 end as charfun
  10. from sales.customers as c cross join TheseEmployees as e)
  11. select custid from CharacteristicFunctions group by custid having min(charfun)=1
  12. order by custid
  13. '
  14. while @execcount<10
  15. begin
  16. exec (@withquery);
  17. set @execcount=@execcount+1
  18. end
  19. /*子查詢*/
  20. declare @subquery varchar(5000)
  21. declare @execcount int=0
  22. set @subquery='select custid from Sales.Orders where empid in
  23. (select empid from HR.Employees where country = N''USA'') group by custid
  24. having count(distinct empid)=(select count(*) from HR.Employees where country = N''USA'');
  25. '
  26. while @execcount<10
  27. begin
  28. exec (@subquery);
  29. set @execcount=@execcount+1
  30. 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語句效率高。

 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved