Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 哪个连接速度更快:1键&x2B;硬编码vs 2键_Sql_Sql Server_Join_Left Join - Fatal编程技术网

Sql 哪个连接速度更快:1键&x2B;硬编码vs 2键

Sql 哪个连接速度更快:1键&x2B;硬编码vs 2键,sql,sql-server,join,left-join,Sql,Sql Server,Join,Left Join,我只是想知道哪个加入会更快 通常,表A的2个键列与表B的2个键列连接,所有键列都被索引 基于百万行级别的两个表 应该是这样的: select * from A left join B on A.key1=B.key1 and A.key2=B.key2 .............. .............. 但是如果我想在key2处使用特定的键值,key2='AA'哪一个更快: 计划A: select * from A left join B on A.key1=B.k

我只是想知道哪个加入会更快

通常,表A的2个键列与表B的2个键列连接,所有键列都被索引

基于百万行级别的两个表

应该是这样的:

select * 
from  A 
left join B 
on  A.key1=B.key1
and A.key2=B.key2
..............
..............
但是如果我想在
key2
处使用特定的键值,
key2='AA'
哪一个更快:

计划A:

select * 
from  A 
left join B 
on  A.key1=B.key1
and A.key2=B.key2
where A.key2='AA'
方案B:

select * 
from  A 
left join B 
on  A.key1=B.key1
where A.key2='AA' and B.key2='AA'

谢谢

唯一确定的方法是尝试两种方法并测量它们。这将取决于可用的索引以及优化器决定如何使用它们


如果每个表的
(key1,key2)
上都有一个复合索引,那么如果有任何差异,我希望join+过滤器会更快。如果在
key1
上只有一个索引,我希望性能大致相同

这两个查询在语义上不等价

当您将
LEFT JOIN
ed表中的一列放入
WHERE
子句时,您将使其成为
内部联接。如果
B
中没有匹配的记录,您将无法从
A
中获取该记录

您的选项是在
WHERE
子句中使用它,就像您在第一个选项中一样,或者将它放入
JOIN

left join B 
on  A.key1=B.key1
AND a.Key1 = 'AA'
…这在大多数RDBMS中也是相同的执行计划


作为可读性规则,您希望在
WHERE
子句中使用此选项,因为下一个人将在该子句中查找筛选器。

为什么不检查执行计划。。。。?也就是说,我认为它们都是一样的。选择查看执行计划