SQL 在连接中添加附加列时,服务器查询连接花费很长时间
SQL Server Query Join taking very long when adding an additional column in the join
我正在 运行 对 table 进行基本查询,每个 table 中都有一个唯一 ID,这是每个中的非聚集索引。一个table有800万行,另一个有80万行。
当我 运行 以下内容时,不到一秒 returns 24,000 行:
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 插入查询,其中包含 20,000 个连接排列,而且它花费的时间太长了。
编辑
在尝试了这么多方法之后,我意识到一个简单的 select *
似乎工作得非常有效,而 selecting 特定的列是罪魁祸首。这是我 select *
:
时的执行计划
这是我select特定列时的执行计划:
同样,我的连接完全相同,但 selection 列不同。
OP说,他没有得到预期的结果,根据他的观察,我会提供不同的解决方案。
我要做的是,执行以下命令并将数据获取到临时 table
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 DISTINCT a.*
into #ta
from
dbo.tbl_1 a
join
dbo.tbl_2 b
on
a.unique_id = b.unique_id
select DISTINCT b.*
into #tb
from
dbo.tbl_1 a
join
dbo.tbl_2 b
on
a.unique_id = b.unique_id
并执行
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
我正在 运行 对 table 进行基本查询,每个 table 中都有一个唯一 ID,这是每个中的非聚集索引。一个table有800万行,另一个有80万行。
当我 运行 以下内容时,不到一秒 returns 24,000 行:
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 插入查询,其中包含 20,000 个连接排列,而且它花费的时间太长了。
编辑
在尝试了这么多方法之后,我意识到一个简单的 select *
似乎工作得非常有效,而 selecting 特定的列是罪魁祸首。这是我 select *
:
这是我select特定列时的执行计划:
同样,我的连接完全相同,但 selection 列不同。
OP说,他没有得到预期的结果,根据他的观察,我会提供不同的解决方案。
我要做的是,执行以下命令并将数据获取到临时 table
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 DISTINCT a.*
into #ta
from
dbo.tbl_1 a
join
dbo.tbl_2 b
on
a.unique_id = b.unique_id
select DISTINCT b.*
into #tb
from
dbo.tbl_1 a
join
dbo.tbl_2 b
on
a.unique_id = b.unique_id
并执行
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