2009-07-31 4 views
0

総数を作るために助けてくださいテナント3のレコードの40352.ほぼ2分10秒を実行するために多くの時間を取って、クエリ私は、このクエリは、高速テーブルgym_membercommonのレコードの

総数は10250ですされています

gym_membercommonテーブルでは、そのテナント内で共通の番号を持つ重複レコードをすべて検索する必要があります。

create table #temp    
(   
    meco_Commonid int,    
    meco_tenantid int,    
    meco_OfficeTelno varchar(30),    
    meco_HomeNo varchar(20),    
    meco_MobileNo varchar(20),    
    meco_Fax varchar(20) 
) 

CREATE CLUSTERED INDEX idxCL_TEMP ON #temp(meco_Commonid) 

CREATE NONCLUSTERED INDEX idxNC_TEMP ON #temp(meco_OfficeTelno,meco_HomeNo,meco_MobileNo,meco_Fax) 

insert into #temp    
select 
    meco_Commonid, 
    meco_tenantid,    
    meco_OfficeTelno,    
    meco_HomeNo,    
    meco_MobileNo,    
    meco_Fax 
from gym_membercommon a     
where    
    meco_tenantId = 1    
    And    
    lower(ltrim(rtrim(meco_status))) <> 'erroneous'    

Select distinct a.*    
from #temp a      
inner join #temp b     
on    
(      
    (ltrim(rtrim(isnull(a.meco_officeTelno,''))) <>'' and a.meco_officeTelno in (b.meco_OfficeTelno,b.meco_HomeNo,b.meco_MobileNo,b.meco_Fax)) or     
    (ltrim(rtrim(isnull(a.meco_HomeNo,''))) <>'' and a.meco_HomeNo in (b.meco_OfficeTelno,b.meco_HomeNo,b.meco_MobileNo,b.meco_Fax)) or     
    (ltrim(rtrim(isnull(a.meco_MobileNo,''))) <>'' and a.meco_MobileNo in (b.meco_OfficeTelno,b.meco_HomeNo,b.meco_MobileNo,b.meco_Fax)) or     
    (ltrim(rtrim(isnull(a.meco_Fax,''))) <>'' and a.meco_Fax in (b.meco_OfficeTelno,b.meco_HomeNo,b.meco_MobileNo,b.meco_Fax))     
)     
and a.meco_Commonid <> b.meco_commonid     
And a.meco_tenantId = 1    

お返事を事前に

感謝待ち。

Dasharathヤダヴ
Fitness Force

答えて

1

あなたのご自身が恐ろしいテーブルカーンを生み出しています。

create table phonenumbers (
    commonid int, 
    phonenumber varchar(30) 
) 

insert into phonenumbers select commonid, meco_HomeNo from gym_membercommon; 
insert into phonenumbers select commonid, meco_OfficeTelno from gym_membercommon; 
insert into phonenumbers select commonid, meco_MobileNo from gym_membercommon; 
insert into phonenumbers select commonid, meco_Fax from gym_membercommon; 

select distinct commonid, phonenumber from phonenumbers 
where phonenumber in 
    (select phonenumber from phonenumbers 
    group by phonenumber 
    having count(*) >= 2) 
order by phonenumber 

これは、あなたに共有の電話番号を持つすべての人を与えます。

+0

感謝トン。これは私の問題を解決しました、それは今3秒以下を取っています。 –

0

それは#TEMPを作成したり、クエリをexeuctingに行く時ですか?

私の推測ではあること

in (b.meco_OfficeTelno,b.meco_HomeNo,b.meco_MobileNo,b.meco_Fax) 

インデックス

INDEX idxNC_TEMP ON #temp(meco_OfficeTelno,meco_HomeNo,meco_MobileNo,meco_Fax) 

より正規化された一時テーブル作業がうから恩恵を受けていないのですか?

meco_Commonid int, 
meco_tenantid int, 
meco_ANY_OLD_NO varchar(30) 

移入すべての4つの数字の抽出物と(これは、単一の抽出物よりも遅くなる可能性が高い)ことしかし、その後、クエリがインデックスを利用するべき参加だけ非常に簡単でなければなりません。

0

方法について:

with temp (
    meco_Commonid, 
    meco_tenantid, 
    meco_OfficeTelno, 
    meco_HomeNo, 
    meco_MobileNo, 
    meco_Fax 
    ) 
as (
    select meco_Commonid, meco_tenantid, 
    meco_OfficeTelno, 
    meco_HomeNo, 
    meco_MobileNo, 
    meco_Fax from gym_membercommon a 
    where 
    meco_tenantId = 1 
    And 
    lower(ltrim(rtrim(meco_status))) <> 'erroneous' 
    ) 
Select distinct a.* 
    from temp a 
    inner join temp b 
    on 
    (
    (ltrim(rtrim(isnull(a.meco_officeTelno,''))) <>'' and a.meco_officeTelno in (b.meco_OfficeTelno,b.meco_HomeNo,b.meco_MobileNo,b.meco_Fax)) or 
    (ltrim(rtrim(isnull(a.meco_HomeNo,''))) <>'' and a.meco_HomeNo in (b.meco_OfficeTelno,b.meco_HomeNo,b.meco_MobileNo,b.meco_Fax)) or 
    (ltrim(rtrim(isnull(a.meco_MobileNo,''))) <>'' and a.meco_MobileNo in (b.meco_OfficeTelno,b.meco_HomeNo,b.meco_MobileNo,b.meco_Fax)) or 
    (ltrim(rtrim(isnull(a.meco_Fax,''))) <>'' and a.meco_Fax in (b.meco_OfficeTelno,b.meco_HomeNo,b.meco_MobileNo,b.meco_Fax)) 
    ) 
    and a.meco_Commonid <> b.meco_commonid 
    And a.meco_tenantId = 1 

しかし...トリムとが低下を取り除くためにしてみてください。インデックスがうまく使用されなくなります。

そして:

create index ixBlah on gym_membercommon (meco_tenantId, meco_status) include (meco_Commonid, meco_OfficeTelno, meco_HomeNo, meco_MobileNo, meco_Fax) 

ロブ

関連する問題