我只是想知道如果两个表在加入列时都有MERGE JOIN
,并且SELECT列表中包含的列也是非聚集索引的一部分,SQL Server是否可以选择使用Non Clustered Index
。
我知道MERGE JOIN的先决条件是必须对连接列进行排序。这只是指聚集索引吗?
答案 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上的聚簇索引。
答案 1 :(得分:1)
是的,它可以使用非聚集索引来执行合并连接,而无需显式排序步骤,只要关键列的顺序可以确保连接谓词中使用的列符合所需的排序顺序。