Sql server 在排序列上合并联接,而不是哈希联接

Sql server 在排序列上合并联接,而不是哈希联接,sql-server,Sql Server,我有两张桌子 表A ( id int, name varchar(39), lname varchar (49), ... ) 表B ( id int, city varchar(39), ... ) 两个表都按列ID排序。ID只是标识,由自动递增的整数1到n填充 但是,如果我输入一个查询,例如 SELECT * FROM A, B WHERE A.id = B.id; 我得到的是散列连接,而不是有效的合并连接。如何在S

我有两张桌子

A

(
    id int, 
    name varchar(39), 
    lname varchar (49), 
    ...
)
B

(
    id int, 
    city varchar(39), 
    ...
)
两个表都按列
ID
排序。ID只是标识,由自动递增的整数1到n填充

但是,如果我输入一个查询,例如

SELECT * 
FROM A, B 
WHERE A.id = B.id;
我得到的是散列连接,而不是有效的合并连接。如何在SQL Server中强制执行合并联接?我不想使用索引,因此没有基于索引的计划

请注意,我也不希望使用排序执行器进行合并联接,我知道可以通过将查询重写为

SELECT * 
FROM A
INNER MERGE JOIN B ON A.ID = B.ID;
顺便说一下,我正在使用SQLServerExpress版。但是,如果开源数据库支持我的查询计划,我可以改为任何开源数据库


提前感谢

如果您认为自己很聪明,那么SQL引擎:-)您可以使用如下点击:

SELECT * 
FROM A
INNER HASH JOIN B
   ON A.id = B.id


至少,您可以测试
合并是否真的更好。即使在这种情况下它更好,也不意味着它永远是最好的选择。在其他情况下,它会降低性能,因此通常最好将此工作留给引擎来完成。

为什么要使用古老的ANSI-89连接语法?开始使用ANSI-92连接语法已经很久了;它已经存在了大约28年了。@Larnu所说的不仅是一个很好的建议,而且可能是你没有得到合并联接的原因:我认为合并联接不适用于完全联接,计划可能会在注意到“过滤条件”实际上是一个内部联接之前放弃它。@Larnu因为输入较少,如果连接语法正在影响优化器,那么SQL团队需要重新思考。但我不相信这一点。@GeorgeMenoutis这不是真的,语法不会影响优化器。你可以试试。如果真是这样,那就太奇怪了。你只得到一个排序执行器的合并连接,这相当于一个糟糕的计划!“因为打字少了”,我相信你这里的意思是“懒惰”。这并不是使用28年前被取代的语法的借口。停止使用它。谢谢你的回答,但它不起作用,计划者正在引入排序执行器,但这不是必需的,因为数据已经排序。@tREX例如,每个表上都有一个PK on ID吗?如果我在有问题的列上定义PK,那么系统将创建一个聚集索引,这是我想要避免的。我的目标是对这两个关系进行合并联接,而不是索引扫描计划。但是我明白你的意思。@Trex PK可以定义为非聚集的。关键是-您认为数据是有序的,但是如果没有帮助结构(索引)来帮助引擎以有序的方式提取数据,则无法避免排序阶段。感谢您的回答,但是我希望找到某种选项,您可以在其中进行设置,以确保排序,从而完全避免使用索引。
SELECT * 
FROM A
INNER MERGE JOIN B
   ON A.id = B.id