我有一个表(Table1),其中包含一些信息和一个字符串ID
我有另一个表(Table2),其中包含更多信息和类似的字符串ID(中间缺少额外的char)。
我最初加入
表t2.StringID = substring(t1.StringID,0,2)+substring(t1.StringID,4,7)
但这太慢了,所以我决定在Table1上创建一个新列,该列已经映射到Table2的PrimaryID,然后索引该col。
因此,要更新新列,我会这样做:
select distinct PrimaryID,
substring(t2.StringID,0,2)+
substring(t2.StringID,4,7)) as StringIDFixed
into #temp
from Table2 t2
update Table1 tl
set t1.T2PrimaryID = isnull(t.PrimaryID, 0)
from Table1 t11, #temp t
where t11.StringID = t.StringIDFixed
and t1.T2PrimaryID is null
它会在几秒钟内创建临时表,但更新现在已经运行了25分钟,我不知道它是否会完成。
表1有45MM行,表2有1.5MM
我知道这是一个庞大的数据量,但是,我觉得这不应该那么难。
这是Sybase IQ 12.7
有什么想法吗?
感谢。
答案 0 :(得分:3)
在临时表上创建了一个索引,花了几秒钟,然后重新运行相同的更新,然后只花了7秒钟。
create index idx_temp_temp on #temp (StringIDFixed)
我讨厌Sybase。
答案 1 :(得分:1)
select distinct isnull(t2.PrimaryID, 0),
substring(t2.StringID,0,2)+
substring(t2.StringID,4,7)) as StringIDFixed
into #temp
from Table2 t2
create HG index idx_temp_temp_HG on #temp (StringIDFixed)
or
create LF index idx_temp_temp_LF on #temp (StringIDFixed)
--check if in Table1 exists index HG or LF in StringID if not.. create index
update Table1 tl
set t1.T2PrimaryID = t.PrimaryID
from Table1 t11, #temp t
where t11.StringID = t.StringIDFixed
-- check if is necesary
-- and t1.T2PrimaryID is null replace for t11.T2PrimaryID is null
答案 2 :(得分:0)
考虑使用内部联接替换更新,以避免大数据集上的isnull()函数。
update Table1
set a.T2PrimaryID = b.PrimaryID
from Table1 a
inner join #temp b
on a.StringID = b.StringIDFixed