2014-11-17 4 views
0

사전에 SQL Query으로 작성했으며 실제로 실행하고 데이터를 표시하려면 45 minutes이 필요합니다. 총 80000+ 개의 레코드를 반환합니다. 그러나 데이터를 실행하고 표시하는 데는 많은 시간이 필요합니다.이전 SQL 쿼리 최적화

SELECT 
hq.QuoteHeaderId, 
hq.HandsetQuoteId, 
hq.QuoteDate, 
t_PhoneAudit.PhoneModelId, 
t_PhoneAudit.IMEI, 
t_PhoneModel.ModelName, 
t_PhoneBrand.Name As BrandName 
, al.ActivityId 
, par.Result 
, al.CustomMessage, 
al.[Description] 
,thqai.Value AS AgentName 
FROM [t_DynaGroupMissingRecordsProcessing] 
INNER JOIN t_HandsetQuote hq ON t_DynaGroupMissingRecordsProcessing.HandsetQuoteId = hq.HandsetQuoteId 
INNER JOIN t_PhoneAudit ON t_PhoneAudit.PhoneAuditId = hq.QuotePhoneAuditId 
INNER JOIN t_PhoneModel ON t_PhoneModel.PhoneModelId = t_PhoneAudit.PhoneModelId 
INNER JOIN t_PhoneBrand ON t_PhoneBrand.PhoneBrandId = t_PhoneModel.PhoneBrandId 
INNER JOIN 
(
    SELECT par.HandsetQuoteId, txt_Value AS ActivityId, 'OK' AS Result FROM t_PhoneAuditRetail par CROSS APPLY dbo.fn_ParseText2Table(par.Ok, ',') 
    UNION 
    SELECT par.HandsetQuoteId, txt_Value AS ActivityId, 'Fault' AS Result FROM t_PhoneAuditRetail par CROSS APPLY dbo.fn_ParseText2Table(par.Fault, ',') 
) par ON hq.HandsetQuoteId = par.HandsetQuoteId 
INNER JOIN t_ActivityLocalization al ON par.ActivityId = al.ActivityId 
INNER JOIN t_ContactChannel CC ON al.ContactChannelId = CC.ContactChannelId 
INNER JOIN t_testingProfiledetails ON t_testingProfiledetails.ActivityId = al.ActivityId AND ( IsVisibleForRetail = '1' OR t_testingProfiledetails.ActivityId IN ('93','97')) AND t_testingProfiledetails.ProfileId IN (SELECT DefailtRetailProfileId FROM t_ContactChannel WHERE Name IN ('Holland Retail', 'BelCompanyNPEY Retail', 'Belcompany Retail', 'HollandNPEY Retail')) 
LEFT OUTER JOIN t_HandsetQuoteAdditionalInfo thqai on thqai.HandsetQuoteId = hq.HandsetQuoteId and thqai.KeyName = 'AgentName' 
WHERE [t_DynaGroupMissingRecordsProcessing].IsProcessed = 0 
AND CC.Name IN ('Holland Retail', 'BelCompanyNPEY Retail', 'Belcompany Retail', 'HollandNPEY Retail') 
ORDER BY hq.HandsetQuoteId 

주요 문제는 CC.Name IN ('Holland Retail', 'BelCompanyNPEY Retail', 'Belcompany Retail', 'HollandNPEY Retail')입니다.

In Statement에 이름을 계속 추가하면 쿼리가 점점 느려집니다.

ALTER FUNCTION [dbo].[fn_ParseText2Table]  
( 
@p_SourceText VARCHAR(8000) 
,@p_Delimeter VARCHAR(100) = ',' --default to comma delimited.  
)  
RETURNS @retTable TABLE  
( 
txt_value VARCHAR(2000)  
)  
AS  
BEGIN  
DECLARE @w_Continue int  
,@w_StartPos int  
,@w_Length int  
,@w_Delimeter_pos int  
,@w_tmp_txt VARCHAR(2000)  
,@w_Delimeter_Len tinyint  

SET @w_Continue = 1  
SET @w_StartPos = 1  
SET @p_SourceText = RTRIM(LTRIM(@p_SourceText))  
SET @w_Length = DATALENGTH(RTRIM(LTRIM(@p_SourceText)))  
SET @w_Delimeter_Len = len(@p_Delimeter)  

WHILE @w_Continue = 1  
BEGIN  
SET @w_Delimeter_pos = CHARINDEX(@p_Delimeter,(SUBSTRING(@p_SourceText, @w_StartPos,((@w_Length - @w_StartPos)[email protected]_Delimeter_Len))))  
IF @w_Delimeter_pos > 0 -- delimeter(s) found, get the value  
BEGIN  
    SET @w_tmp_txt = LTRIM(RTRIM(SUBSTRING(@p_SourceText, @w_StartPos  
,(@w_Delimeter_pos - 1))))  
    SET @w_StartPos = @w_Delimeter_pos + @w_StartPos + (@w_Delimeter_Len- 1)  
END  
ELSE  -- No more delimeters, get last value  
BEGIN  
    SET @w_tmp_txt = LTRIM(RTRIM(SUBSTRING(@p_SourceText, @w_StartPos  
    ,((@w_Length - @w_StartPos) + @w_Delimeter_Len))))  
    SELECT @w_Continue = 0  
END  
INSERT INTO @retTable VALUES(@w_tmp_txt)  
END  
RETURN 

END이 쿼리를 최적화하기 위해

이 제발 도와주세요 :

다음은 내가 사용하고있는 기능에 대한 (고화질)입니다.

+0

내가 사용하고있는 기능을보고 시작하는 것입니다 시도 할 수 있습니다. – Chris

+0

@Chris 업데이트 된 질문을 확인하십시오 – HarshSharma

답변

0

Insert the list of names to @table(name) and join it to cc 
on [email protected] 
+0

Thanks man !! 그것은 잘 작동 – HarshSharma

+0

얼마나 시간을 절약 할 수 있습니까? –

+0

꽤 많은 시간, 지금은 1 분 안에 실행됩니다 :) 명성 !!! – HarshSharma