Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 从不同的表列中非常缓慢地排序 我有两张表(表1,表2) 表1有20000000条记录 表2有0条记录 表1具有ID的聚集索引和ID为2的非聚集索引,表2具有ID的聚集索引_Sql Server_Tsql - Fatal编程技术网

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。