【问题标题】:Order by from different table column very slowly从不同的表列排序非常慢
【发布时间】:2018-12-05 22:52:50
【问题描述】:
  • 我有两个表(table1table2
  • 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


【解决方案1】:

左连接意味着 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 

【讨论】:

  • 感谢您的回答,实际上上面的查询是视图中的一个语句,但我无法修改该视图,我只能使用 select col1,col2 from v1 order by col1,col2。
猜你喜欢
  • 1970-01-01
  • 2016-03-12
  • 1970-01-01
  • 2022-09-27
  • 2012-05-28
  • 2023-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多