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

Sql 这个查询需要很多时间来执行,如何优化它?,sql,database,replace,database-performance,query-performance,Sql,Database,Replace,Database Performance,Query Performance,我用它来清理田野。但执行起来要花上几个小时 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,

我用它来清理田野。但执行起来要花上几个小时

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)  

我想根据表中的name字段比较这三个表。我已经计算了长度,并使用子字符串函数来匹配多达15个位置。

一种方法是添加计算列并为它们编制索引:

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:你需要确保你的表达式是无懈可击的,不会因长度无效等原因崩溃。否则它将停止你插入和更新记录

请用谷歌重新堆叠溢出问题标记,然后使用代码块格式(单击“{}”),并查看你的帖子在编辑窗口下的显示方式。同时阅读和阅读。另外,请阅读DBMS和用户查询优化。请格式化您的代码。乍一看,由于您正在动态清理数据,因此在这种情况下添加索引可能不会有多大帮助。希望现在它更容易理解。您应该在查询数据之前清理数据。应用这样的函数将消除您使用索引的能力。如果您有能力更改表,您可以创建一些计算的持久化列,然后在这些列上放置索引,然后在索引列上进行联接。每个表有多少行?请编辑您的问题并添加此信息