为什么合并的SQL-Server排序聚簇索引列连接表

时间:2017-11-23 12:15:12

标签: sql sql-server sorting join clustered-index

假设我有以下表格,填充了数百万条记录:

create table table1 (
    id int not null
);
alter table table1 add constraint pk_table1_id primary key (
    id asc
);

create table table2 (
    t1_id int not null,
    id int not null
);
alter table table2 add constraint pk_table2_t1_id_id primary key (
    t1_id asc,
    id asc
);

我想加入这样的表:

select
*
from
table1 t1
left join table2 t2
    on t1.id = t2.t1_id
order by t1.id--, t2.id

SQL-Server(2005)生成以下执行计划:

enter image description here

SQL-Server正确选择merge-join-operation并取消了sort操作,因为这两个表已经使用table1的id列进行了排序。

现在,如果我取消注释order-by-clause的第二部分,它使用table2主键的第二个键,SQL-Server使用以下计划:

enter image description here 即使我使用merge-join-hint,SQL-Server也会在加入两个表后对数据进行排序。

我的问题:

  • 为什么SQL-Server必须对索引列的数据进行排序?
  • 有没有办法更改查询,表列或索引,这可以让SQL-Server消除这种特定的排序操作?

0 个答案:

没有答案