在联接中添加附加列时,SQL Server查询联接需要很长时间

在联接中添加附加列时,SQL Server查询联接需要很长时间,sql,performance,sql-server-2012,execution-time,database-tuning,Sql,Performance,Sql Server 2012,Execution Time,Database Tuning,我在一个表上运行一个基本查询,每个表中都有一个唯一的ID,每个表中都有一个非聚集索引。一个表有800万行,另一个表有800000行 当我运行以下命令时,它在不到一秒钟的时间内返回24000行: select a.[ID] ,b.[ID] from dbo.tbl_1 a join dbo.tbl_2 b on a.unique_id = b.unique_id 然而,当我在连接中添加一

我在一个表上运行一个基本查询,每个表中都有一个唯一的ID,每个表中都有一个非聚集索引。一个表有800万行,另一个表有800000行

当我运行以下命令时,它在不到一秒钟的时间内返回24000行:

select     
    a.[ID]      
    ,b.[ID]    
from     
    dbo.tbl_1 a    
join     
    dbo.tbl_2 b    
on 
    a.unique_id = b.unique_id 
然而,当我在连接中添加一个额外的列,这将显著减少记录集时,这需要大约8分钟

select     
    a.[ID]      
    ,b.[ID]    
from     
    dbo.tbl_1 a    
join     
    dbo.tbl_2 b    
on 
    a.unique_id = b.unique_id 
    AND a.code_letter = b.code_letter
“code_letter”列只有一个字母,设置为varchar(1)。我挠头想弄明白为什么这是挂着的。问题是,我运行了一个动态sql insert查询,其中包含20000个连接排列,而且耗时太长

编辑 在尝试了这么多方法之后,我意识到一个简单的
select*
似乎非常有效,而选择特定的列是罪魁祸首。这是我选择*时的执行计划:

以下是我选择特定列时的执行计划:


同样,我的联接完全相同,但列选择不同。

OP说,他没有得到预期的结果,根据他的观察,我将提供不同的解决方案

我要做的是,执行以下命令并将数据获取到临时表中

select     
    a.[ID] as aID      
    ,b.[ID] as bID
    ,a.code_letter as aCode_letter  
    ,b.code_letter as bCode_letter
into #t
from     
    dbo.tbl_1 a    
join     
    dbo.tbl_2 b    
on 
    a.unique_id = b.unique_id 
然后执行以下命令

Select aID, bID from #t Where aCode_letter = bCode_letter

和执行官

Select a.ID, b.ID 
from #ta a
Inner Join #tb b 
on a.unique_id = b.unique_id and a.Code_letter = b.Code_letter

您是否尝试过在代码字母列上创建索引?我尝试过,但出于某种原因,这并没有起到任何作用……但即使这样做了,这将是一个恼人的情况,我必须为每次迭代创建一个索引并删除它,这可能也很耗时。我想知道这是否与缓存执行计划或类似的事情有关。这似乎是由动态SQL所引发的,动态SQL不断地使用联接中的不同列运行insert查询?有关性能问题,请从
EXPLAIN
中显示查询计划。这8分钟是单个查询本身的结果还是动态sql插入查询过程的结果?如果是后者,则显示更完整的TSQL代码。它来自单个查询。这是在t-sql中,所以我不能使用解释。我提出了动态部分,以防有理由相信这会导致意外问题。我尝试过,但不幸的是,这很耗时。下面是我学到的最新知识:当我运行时:
Select*
似乎会在几秒钟内返回结果,而当我选择特定列时,它会旋转几分钟。我以前从未见过这种行为,这是一种出乎意料的行为。那你为什么不这样做呢。例如,选择*然后分别进行第二部分?或者将a.*和b.*分别放入另一个临时tbl,然后加入这两个临时tbl。问题是,我必须对列进行大量重命名。如果这有助于确定其执行如此不同的原因,我将在原始版本中添加执行计划差异。请尝试我的新建议,虽然这似乎是一个可以避免的解决方法,但确实有效。非常感谢。
Select a.ID, b.ID 
from #ta a
Inner Join #tb b 
on a.unique_id = b.unique_id and a.Code_letter = b.Code_letter