这个查询需要很多时间来执行,如何优化它?

这个查询需要很多时间来执行,如何优化它?

问题描述:

我已经使用replace来清理字段。但需要执行时间。这个查询需要很多时间来执行,如何优化它?

select c.* 
from 
( 
select distinct a.*, b.* 
from 
( 
--Table 1 
select replace(replace(replace(replace(AGENCY_NAME,'',''),'',''),'/',''),'\\','') 
as agency_name,  
LEN(replace(replace(replace(replace(AGENCY_NAME,' ',''),'-',''),'/',''),'\\',''))  
as agency_len 
from dbo.tbl_stars_agency 
where replace(replace(replace(replace(AGENCY_NAME,' ',''),'-',''),'/',''),'\\','') 
not in ('') 
) a  
inner join 
( 
--Table 2 
select replace(replace(replace(replace(RESPONDENT_NAME_PER,' ',''),'.',''),'/',''),'\\','') 
as respondent_name, 
len(replace(replace(replace(replace(RESPONDENT_NAME_PER,' ',''),'-',''),'/',''),'\\','')) 
as respondent_len 
from dbo.TBL_cacs_ecb 
where replace(replace(replace(replace(RESPONDENT_NAME_PER,' ',''),'-',''),'/',''),'\\','') not in ('')  
) b 
on substring(a.agency_name,1,15)=SUBSTRING(b.respondent_name,1,15) 
) c 
inner join 
( 
--Table 3 
select replace(replace(replace(replace(NM_ENTITY,' ',''),'-',''),'/',''),'\\','') 
as nm_entity, 
LEN(replace(replace(replace(replace(NM_ENTITY,' ',''),'-',''),'/',''),'\\','')) 
as nm_entity_len 
from dbo.RMFS010_TF1NAME 
where replace(replace(replace(replace(NM_ENTITY,' ',''),'-',''),'/',''),'\\','') 
not in ('') 
) d 
on substring(c.agency_name,1,5)=substring(d.nm_entity,1,5) or 
substring(c.respondent_name,1,5)=substring(d.nm_entity,1,5) 

我想根据表中的名称字段比较三个表。我计算了长度和使用子字符串函数以匹配15个位置。

+2

请google重新编写stackoverflow问题标记,然后使用代码块格式(点击“{}”)并查看您的帖子如何显示在编辑窗口下方。另请阅读[问]和[mcve]。还阅读关于DBMS和用户查询优化。 – philipxy

+0

请格式化您的代码。乍一看,因为您正在进行数据清理,所以在这种情况下添加索引可能无济于事。 –

+0

希望现在它更容易理解。 – nfs

一种方法是添加计算的列和索引他们:

ALTER TABLE dbo.tbl_stars_agency 
ADD agency_len AS LEN(replace(replace(replace(
replace(AGENCY_NAME,' ',''),'-',''),'/',''),'\','')) 
PERSISTED; 

现在添加一个索引:

CREATE INDEX MyIndex dbo.tbl_stars_agency 
(agency_len); 

现在,在这个任何搜索要快很多。

你可以改变这一行:

where replace(replace(replace(
replace(AGENCY_NAME,' ',''),'-',''),'/',''),'\','') 
not in ('') 

这样:

where agency_len = 0 

试一下,如果它可以帮助我们可以看看这样做是为了其他列

PS:您需要要确定你的表情是水密的,并且不会由于长度无效等而崩溃,否则它会阻止你插入和更新记录