2016-07-07 85 views
1

因此,我对SQL相当陌生,并且在我目前的实习中负责修改/记录程序。将SELECT DISTINCT运行到SELECT的优点

要切入,我运行上的表以下查询:

SELECT COUNT(*) as NumofAccounts 
    FROM Accounts 
     WHERE Deleted = 0 
     AND Account_ID In (SELECT DISTINCT Account_ID FROM Tasks WHERE Deleted = 0); 

其产生NumofAccounts = 18

然而原始查询是的结果:

SELECT COUNT(*) as NumofAccounts 
     FROM Accounts 
      WHERE Deleted = 0 
      AND Account_ID In (SELECT Account_ID FROM Tasks WHERE Deleted = 0); 

这两个查询都会产生NumofAccounts = 18,但是,如果分隔查询的这一部分:

SELECT Account_ID FROM Tasks WHERE Deleted = 0; 

有736行结果,其中很多都是重复的Account_IDs。

但如果加上DISTINCT:

SELECT DISTINCT Account_ID FROM Tasks WHERE Deleted = 0; 

只有18行的结果,这与NumofAccounts嘲弄。

有什么办法可以分析这两个查询之间的运行时间或效率差异吗?

对不起,冗长的帖子!

+0

由于'Account_ID'中的内存索引自动创建,'DISTINCT'会执行得更慢。不需要将'DISTINCT'与'IN'语句结合使用。 –

+1

仅供参考,请参阅查询的估计和实际执行计划:[(MSDN:execution plans)](https://msdn.microsoft.com/en-us/library/ms189562(v = sql.105) .aspx)这将允许你执行你需要的分析。 –

+0

@ChrisPickford它们在逻辑上是相同的查询,查询引擎可能可以解决这个问题并为它们生成相同的计划。 – Caleth

回答

3

您可以打开查询执行计划,看看如何在您的查询执行: Query execution plan

而且,你可以打开客户端的统计数据,并获得总执行时间:

Statistics

因此,使用这些工具,你可以COMPA重新选择不同的查询,并选择更好的一个

+0

太棒了!谢谢! – WakaChewbacca

+1

@WakaChewbacca乐于提供帮助,不要因为阅读关于查询执行计划的更多信息而烦恼 - 这真的是非常重要的信息 – Backs

0

可以使用存在哪些可以做一个更好的工作..需要

SELECT COUNT(*) as NumofAccounts 
FROM Accounts a 
WHERE Deleted = 0 
AND exists (SELECT Account_ID FROM Tasks t WHERE t.Deleted = 0 and t.account_id=a.account_id) ; 

当你说效率,需要缩小到几个领域,如

1.Execution时间有待提高
2.query消耗更多的CPU
3.使用更多的内存

如果你的效率与执行时间,上面的查询可以工作更好..

你两个查询可能工作方式不同基于对这些表提供了一些因素,如索引,执行计划choosen

+1

不是,应该生成相同的执行计划。 – Magnus