【发布时间】:2018-12-05 22:52:50
【问题描述】:
- 我有两个表(table1、table2)
- table1 有 20000000 条记录
- table2 有 0 条记录
- table1 有 ID 为聚集索引,ID2 为非聚集索引,table2 有 ID 为聚集索引
-
下面的查询非常快:
select top 100 table1.Name,table2.Name from table1 WITH (NOLOCK) left join table2 on table1.ID2= table2.ID order by table1.ID desc' -
以下查询需要很长时间才能执行:
select top 100 table1.Name,table2.Name from table1 WITH (NOLOCK) left join table2 on table1.ID2= table2.ID order by table1.ID desc,table2.ID desc'
这是执行计划:
我可以用order by table1.ID desc,table2.ID desc 执行sql 做什么?
【问题讨论】:
-
这有点做作,因为第二个表是空的。当第二个表有实际数据时会发生什么,这不是更现实的用例吗?
-
实际情况是table2只有10条记录
-
使用此处的代码复制此代码 rextester.com/YKTHXB31408 显示我的 SQL Server 2017 上的执行计划没有差异,在 table1 中测试了多达 200000 行。你能确认结构和索引与你的相似吗?
-
你能把'OPTION (RECOMPILE)'放在两个语句的最后,看看有什么不同吗?对于第二条语句,这可能是缓存中的错误计划。
-
@DirkMa 它没有显示执行的差异。我认为 uniqueidentifier 上的聚集索引可能是问题所在。如果您要为每个插入的数据移动数据(因为 guid 本质上是随机的),您会快速分割表,也可能对磁盘造成损害。您可以重建聚集索引并重试吗?查看索引 PK_Table1 的属性,看是否分片。
标签: sql-server tsql