内部查询的SQL查询性能

时间:2017-07-03 13:30:20

标签: sql sql-server

我不确定这个问题的标题是否正确。

我有一个表格,例如users,其中包含不同类型的用户。与用户类型10, 20, 30等类似。

在查询中我需要加入user表,但我只想要用户类型20.所以下面哪个查询的表现更好。

 SELECT fields 
 FROM consumer c 
 INNER JOIN user u ON u.userid = c.userid
 WHERE u.type = 20

另一方面,

 SELECT fields 
 FROM consumer c 
 INNER JOIN (SELECT user_fields FROM  user WHERE type = 20) u ON u.userid = c.userid

请指教。

4 个答案:

答案 0 :(得分:5)

让我们从这个查询开始:

SELECT . . . 
FROM consumer c INNER JOIN 
     user u
      ON u.userid = c.userid
 WHERE u.type = 20;

假设type相对较少,您需要表上的索引。最佳索引可能是user(type, userid)customer(userid)user(userid, type)上的索引可能会更好(如果userid是群集主键,则可能是不必要的。)

第二个查询。 。 。好吧,从SQL Server的角度来看,它可能是相同的。为什么? SQL Server有一个很好的优化器。如果您愿意,可以查看执行计划。由于优化器:

  1. 让子查询只选择少数列是没有好处的。无论好坏,SQL Server都会将该信息推送到读取数据的节点。
  2. where子句不一定会在join之前进行评估。 SQL Server足够聪明,可以重新安排操作。
  3. 并非所有优化者都这么聪明。在MySQL,MS Access或SQLite等数据库中,我很确定第一个版本比第二个版本要好得多。

答案 1 :(得分:1)

这实际上取决于许多因素:

  • 是" userid"在两个表索引?
  • 是" type"在桌子上"用户"索引?
  • 每张桌子中有多少行?

通常子查询会产生较慢的性能,但根据上面列出的条件以及如何配置sql server安装,查询分析器可以解析(并执行)查询。

SQLServer接受您的查询并尝试对其进行优化,以便查询B被转换为"在查询A中。

查看两个查询的QueryAnalyzer工具,看看它们是否存在差异。

一般来说,内部查询最好避免使用,并且您可能会在查询A中获得最佳性能。

答案 2 :(得分:1)

在SSMS中作为批处理运行两个查询,然后单击"执行计划" ,您会发现两个查询的执行计划和查询成本(相对于批处理):50%

这意味着他们是一样的。

如果它们不同(在某些优化的情况下),您会发现比率不同。

我模拟了您的查询并找到了查询费用= 50%===>即它们是一样的。

答案 3 :(得分:0)

您的选项均有效。个人会像这样编码;

SELECT fields 
FROM consumer c 
INNER JOIN user u ON u.userid = c.userid and u.type = 20

在SQL Management Studio(查询)中运行两个查询并勾选“包含实际执行计划”。这样您就可以看到查询的性能。这取决于您的特定数据库。