SQL Server是否使用Merge Join with Non clustered index或Merge join仅需要Clustered Index?

时间:2015-03-26 09:54:17

标签: sql-server database-performance

我只是想知道如果两个表在加入列时都有MERGE JOIN,并且SELECT列表中包含的列也是非聚集索引的一部分,SQL Server是否可以选择使用Non Clustered Index

我知道MERGE JOIN的先决条件是必须对连接列进行排序。这只是指聚集索引吗?

2 个答案:

答案 0 :(得分:2)

非聚集索引可用于执行合并连接。只有预先要求的是连接列与索引列顺序匹配。

试试这个。

DROP TABLE snapshot 
CREATE TABLE snapshot (id int identity(1,1) primary key clustered ,batchid INT,sqltime DATETIME)

INSERT INTO snapshot(sqltime,batchid) VALUES('2015-03-26 08:20:54.077', 1),
('2015-03-26 08:20:54.077', 1 ),
('2015-03-26 08:20:54.077', 1),
('2015-03-26 08:20:54.077', 1),
('2015-03-26 08:20:54.077', 1),
('2015-03-26 08:22:54.077', 2),
('2015-03-26 08:22:54.077', 2),
('2015-03-26 08:22:54.077', 2),
('2015-03-26 08:22:54.077', 2),
('2015-03-26 08:26:54.077', 3),
('2015-03-26 08:26:54.077', 3)


CREATE NONCLUSTERED INDEX IX_snapshot_Non_Clustered ON snapshot(batchid)include(sqltime)

SELECT * FROM snapshot s1 INNER MERGE JOIN snapshot s2 on S1.batchid = s2.batchid

在上述查询的执行计划中,您可以看到合并连接位于非聚集索引上,而不是ID上的聚簇索引。

Query PLan

答案 1 :(得分:1)

是的,它可以使用非聚集索引来执行合并连接,而无需显式排序步骤,只要关键列的顺序可以确保连接谓词中使用的列符合所需的排序顺序。