Ниже приведен мой SQL-запрос, который занимает более 10 минут и все еще выполняется ....
select DISTINCT Auditdata.ID,ns.ProviderMaster_ID as CDRComment
from Auditdata AuditData
inner join AuditMaster am
on am.ID=AuditData.AuditMaster_ID
inner join HomeCircleMaster hcm
on hcm.Ori_CircleMaster_ID=am.CircleMaster_ID
and hcm.Ori_ServiceTypeMaster_ID=1
and hcm.Dest_ServiceTypeMaster_ID=1
inner join NoSeriesMaster ns
on (ns.CircleMaster_ID=am.CircleMaster_ID
or ns.CircleMaster_ID=hcm.Dest_CircleMaster_ID)
and ns.ProviderMaster_ID<>am.ProviderMaster_ID
and ns.ServiceTypeMaster_ID=1
INNER JOIN NoSeriesMaster_Prefix PD
ON SUBSTRING(AuditData.CallTo, 1, CONVERT(INT, PD.PrefixLen)) = PD.PrefixNo
AND LEN(AuditData.CallTo) = CONVERT(VARCHAR(10), CONVERT(INT, PD.PrefixLen) + CONVERT(INT, PD.AfterPrefixLen))
AND PD.PrefixNo + ns.NoSeries = LEFT(AuditData.CallTo, len(ns.NoSeries) + CONVERT(INT, PD.PrefixLen))
where AuditData.TATCallType is null
and AuditData.AuditMaster_ID=74
and PrefixType='CALL'
В каждом столбце, используемом во внутреннем объединении, не определен индекс, а в столбцах, где в предложении также задан индекс ...
есть ли способ быстро выполнить запрос выше
Пожалуйста, помогите мне ...
Thanx
Дорогие друзья, я изменил мой SQL-запрос так, как следует, его выполнение все еще занимает много времени для 15000000
модифицированные SQL-запросы выглядят следующим образом:
select DISTINCT Auditdata.ID,ns.ProviderMaster_ID as CDRComment from Auditdata AuditData inner join AuditMaster am on am.ID=AuditData.AuditMaster_ID inner join HomeCircleMaster hcm on hcm.Ori_CircleMaster_ID=am.CircleMaster_ID and hcm.Ori_ServiceTypeMaster_ID=1 and hcm.Dest_ServiceTypeMaster_ID=1 inner join NoSeriesMaster ns on (ns.CircleMaster_ID=am.CircleMaster_ID or ns.CircleMaster_ID=hcm.Dest_CircleMaster_ID) and ns.ProviderMaster_ID<>am.ProviderMaster_ID and ns.ServiceTypeMaster_ID=1 INNER JOIN NoSeriesMaster_Prefix PD ON Auditdata.callto like PD.PrefixNo + '%' AND AuditData.CallTolen = PD.PrefixLen + PD.AfterPrefixLen AND PD.PrefixNo + ns.NoSeries = LEFT(AuditData.CallTo, NoSeriesLen + PD.PrefixLen)
where AuditData.TATCallType is null and AuditData.AuditMaster_ID=74 and PrefixType='CALL'
Теперь, что я могу сделать ??
Дорогой друг
мой запрос занимает много раз, потому что
ниже часть кода
NoSeriesMaster содержит 4000 строк и Auditdata 15000000 строк
с внутренним объединением каждой записи столбцов callto в AuditData, сопоставленной с Noseriesmaster
INNER JOIN NoSeriesMaster_Prefix PD
ON SUBSTRING (AuditData.CallTo, 1, CONVERT (INT, PD.PrefixLen)) = PD.PrefixNo
AND LEN (AuditData.CallTo) = CONVERT (VARCHAR (10), CONVERT (INT, PD.PrefixLen) + CONVERT (INT, PD.AfterPrefixLen))
AND PD.PrefixNo + ns.NoSeries = LEFT (AuditData.CallTo, len (ns.NoSeries) + CONVERT (INT, PD.PrefixLen))
где AuditData.TATCallType имеет значение null, а AuditData.AuditMaster_ID = 74 и PrefixType = 'CALL'