内部查询的SQL查询性能

Vin*_*esh 0 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
Run Code Online (Sandbox Code Playgroud)

用另一种方式,

 SELECT fields 
 FROM consumer c 
 INNER JOIN (SELECT user_fields FROM  user WHERE type = 20) u ON u.userid = c.userid
Run Code Online (Sandbox Code Playgroud)

请指教.

Gor*_*off 5

让我们从这个查询开始:

SELECT . . . 
FROM consumer c INNER JOIN 
     user u
      ON u.userid = c.userid
 WHERE u.type = 20;
Run Code Online (Sandbox Code Playgroud)

假设这种type情况比较少见,您需要表上的索引.最好的指标可能user(type, userid)customer(userid).索引user(userid, type)可能会更好(如果userid是群集主键,则不需要).

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

  1. 使子查询只选择少数列是没有好处的.无论好坏,SQL Server都会将该信息推送到读取数据的节点.
  2. where条款不一定要在之前进行评估join.SQL Server足够聪明,可以重新安排操作.

并非所有优化者都这么聪明.在MySQL,MS Access或SQLite等数据库中,我很确定第一个版本比第二个版本要好得多.