Sql server 从不同的表列中非常缓慢地排序 我有两张表(表1,表2) 表1有20000000条记录 表2有0条记录 表1具有ID的聚集索引和ID为2的非聚集索引,表2具有ID的聚集索引
以下查询速度非常快:Sql server 从不同的表列中非常缓慢地排序 我有两张表(表1,表2) 表1有20000000条记录 表2有0条记录 表1具有ID的聚集索引和ID为2的非聚集索引,表2具有ID的聚集索引,sql-server,tsql,Sql Server,Tsql,以下查询速度非常快: 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 ta
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'
对于执行sql,我可以用
order by table1.ID desc,table2.ID desc做什么?左连接意味着table1中的每一行将保证至少有一行贡献给结果,并且您永远不需要该表中超过100行
所以我会试试
WITH T1Top100
AS (SELECT TOP 100 *
FROM table1
ORDER BY ID DESC)
SELECT TOP 100 table1.NAME,
table2.NAME
FROM T1Top100 table1
LEFT JOIN table2
ON table1.ID2 = table2.ID
ORDER BY table1.ID DESC,
table2.ID DESC
这有点做作,因为第二个表是空的。当第二个表有实际数据时会发生什么情况?这不是更现实的用例吗?实际情况是表2只有10条记录。将此记录与此处的代码进行复制显示,在我的SQL Server 2017上执行计划没有差异,在表1中测试了多达200000行。你能确认结构和索引与你的相似吗?你能在两个语句的末尾加上“OPTION(RECOMPILE)”,看看是否有什么不同吗?对于第二条语句,缓存中的计划可能不好。@DirkMa它没有显示执行中的差异。我认为uniqueidentifier上的聚集索引可能是问题所在。如果移动已进行的每个插入的数据(因为guid本质上是随机的),则会快速分割表,还可能对磁盘造成损害。能否重新生成聚集索引并重试?查看索引PK_Table1的属性,看看它是否是分段的。感谢您的回答,实际上上面的查询是视图中的一条语句,但我不能修改该视图,我只能使用select col1,col2 from v1 order by col1,col2。