我不确定这个问题的标题是否正确。
我有一个表格,例如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
请指教。
答案 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有一个很好的优化器。如果您愿意,可以查看执行计划。由于优化器:
where
子句不一定会在join
之前进行评估。 SQL Server足够聪明,可以重新安排操作。并非所有优化者都这么聪明。在MySQL,MS Access或SQLite等数据库中,我很确定第一个版本比第二个版本要好得多。
答案 1 :(得分:1)
这实际上取决于许多因素:
通常子查询会产生较慢的性能,但根据上面列出的条件以及如何配置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(查询)中运行两个查询并勾选“包含实际执行计划”。这样您就可以看到查询的性能。这取决于您的特定数据库。