sql-server – 为什么更改声明的连接列顺序会引入排序?
发布时间:2020-05-28 19:33:36 所属栏目:MsSql 来源:互联网
导读:我有两个具有相同名称,类型和索引键列的表.其中一个具有唯一的聚簇索引,另一个具有非唯一的索引. 测试设置 安装脚本,包括一些实际的统计信息 DROP TABLE IF EXISTS #left;DROP TABLE IF EXISTS #right;CREATE TABLE #left ( a char(4) NOT NULL, b char(2) N
|
我有两个具有相同名称,类型和索引键列的表.其中一个具有唯一的聚簇索引,另一个具有非唯一的索引. 测试设置 安装脚本,包括一些实际的统计信息 DROP TABLE IF EXISTS #left;
DROP TABLE IF EXISTS #right;
CREATE TABLE #left (
a char(4) NOT NULL,b char(2) NOT NULL,c varchar(13) NOT NULL,d bit NOT NULL,e char(4) NOT NULL,f char(25) NULL,g char(25) NOT NULL,h char(25) NULL
--- and a few other columns
);
CREATE UNIQUE CLUSTERED INDEX IX ON #left (a,b,c,d,e,f,g,h)
UPDATE STATISTICS #left WITH ROWCOUNT=63800000,PAGECOUNT=186000;
CREATE TABLE #right (
a char(4) NOT NULL,h char(25) NULL
--- and a few other columns
);
CREATE CLUSTERED INDEX IX ON #right (a,h)
UPDATE STATISTICS #right WITH ROWCOUNT=55700000,PAGECOUNT=128000;
复制品 当我在他们的集群键上加入这两个表时,我希望有一对多的MERGE连接,如下所示: SELECT *
FROM #left AS l
LEFT JOIN #right AS r ON
l.a=r.a AND
l.b=r.b AND
l.c=r.c AND
l.d=r.d AND
l.e=r.e AND
l.f=r.f AND
l.g=r.g AND
l.h=r.h
WHERE l.a='2018';
这是我想要的查询计划: (别介意警告,它们与虚假统计数据有关.) 但是,如果我在连接中更改列的顺序,如下所示: SELECT *
FROM #left AS l
LEFT JOIN #right AS r ON
l.c=r.c AND -- used to be third
l.a=r.a AND -- used to be first
l.b=r.b AND -- used to be second
l.d=r.d AND
l.e=r.e AND
l.f=r.f AND
l.g=r.g AND
l.h=r.h
WHERE l.a='2018';
… 有时候是这样的: Sort运算符似乎根据声明的连接顺序对流进行排序,即c,a,h,这会向我的查询计划添加阻塞操作. 我看过的东西 >我已经尝试将列更改为NOT NULL,结果相同. (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
