Выполнение запроса занимает много времени почти 2 минуты 10 секунд. Пожалуйста, помогите мне сделать этот запрос быстрым - PullRequest
0 голосов
/ 31 июля 2009

Общее количество записей в таблице gym_membercommon составляет 40352.

Общее количество записей для арендатора 3 составляет 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              

В ожидании вашего ответа

спасибо заранее.

Дашарат Ядав
Фитнес-сила

Ответы [ 3 ]

1 голос
/ 31 июля 2009

Ваши 'или' создают ужасные сканы.

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 голосов
/ 31 июля 2009

Как насчет:

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)

Rob

0 голосов
/ 31 июля 2009

Настало ли время для создания #temp или выполнения запроса?

Я думаю, что

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 чисел (вероятно, это будет медленнее, чем ваша единичная выдержка) Но тогда запрос должен быть только довольно простым соединением, которое должно использовать индекс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...