【问题标题】:Would SQL Server use Merge Join with Non clustered index or Merge join need Clustered Index only?SQL Server 会使用非聚集索引的合并联接还是合并联接只需要聚集索引?
【发布时间】:2015-05-30 06:58:57
【问题描述】:

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

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

【问题讨论】:

  • A MERGE JOIN 需要有排序的输入才能工作。 任何索引都按定义排序 - 非聚集或聚集 - 因此这两种类型的索引都应该能够支持 MERGE JOIN

标签: sql-server database-performance


【解决方案1】:

非聚集索引可用于执行合并连接。唯一的前提是连接列与索引列顺序匹配。

试试这个。

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

在上述查询的执行计划中,您可以看到 Merge Join 在非聚集索引上,而不是在 id 上的聚集索引。

【讨论】:

  • 您在连接操作中明确提到了 MERGE,这就是示例显示 Merge 连接的原因。我可以看到未使用排序操作并且 sql server 正在使用 NC 索引。你是不是因为 example 的数据少而使用它?
  • @ShantanuGupta 是的,由于我的示例数据较少,如果我没有明确提及 MERGE 查询提示,SQL Server 很可能会使用嵌套连接。我明确添加了 MERGE 以复制问题并表明合并连接可以在 NC 索引上发生,并且也可以在没有排序操作的情况下发生。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-15
    • 2013-08-20
    • 2018-05-08
    • 2012-10-01
    • 2017-04-01
    • 1970-01-01
    • 2011-03-13
    相关资源
    最近更新 更多