Good day I've been optimizing this query for a time now.. originally all the joins are combined through out the whole query... what I did was create a temporary tables to gather all the data first then separated the joins in two portions.. one it applied to the temporary table(#tempclaims) and another is applied to the output table(#openclaimstemp).. but then only minimal difference in time was produced.. may you kindly help me simplify my query...
BEGIN DECLARE @IsCount int = 0, @AssignTo nvarchar(30) = '', @ClaimStatus nvarchar(50)= '', @DelayDaysFrom int = 2, @DelayDaysTo int = 10000 DECLARE @QUERY varchar(max) DECLARE @COUNT INT IF @DelayDaysFrom = 1 BEGIN SET @DelayDaysFrom = 2 SET @DelayDaysTo = 10000 END IF object_id('tempdb..#OpenClaimTemp') IS NOT NULL BEGIN DROP TABLE #OpenClaimTemp END CREATE TABLE #OpenClaimTemp ( [PROVIDERCODE] [VARCHAR](150) NULL, [PROVIDERNAME] [VARCHAR](150) NULL, [COMPANY] [VARCHAR](250) NULL, [FUNDING_MGNT] [VARCHAR](50) NULL, [BATCHNO] NVARCHAR(50) NULL, [CLAIMNO] NVARCHAR(50) NULL, [PHYSICIAN_NAME] [VARCHAR](150) NULL, [PATIENT_NAME] [VARCHAR](150) NULL, [PAYORLINK_RECEIVED_DATE] [NVARCHAR](50) NULL, [MAXICARE_RECEIVED_DATE] NVARCHAR(50) NULL, [AVAILMENT_DATE] NVARCHAR(50) NULL, [CLAIM_STATUS] [VARCHAR](150) NULL, [CLAIM_TYPE] [VARCHAR](150) NULL, [PROCESSOR] [VARCHAR](150) NULL, [NET_PAYABLE_AMOUNT] [VARCHAR](150) NULL, [NO._OF_DAYS_DELAYED] [VARCHAR](150) NULL , [ASSIGN_TO] [VARCHAR](150) NULL, [PPD] NVARCHAR(50) NULL, [PPD_DUE_DATE] NVARCHAR(50) NULL, [CREDIT_LIMIT] [VARCHAR](150) NULL, [PRESCRIPTION_TERM] [VARCHAR](250) NULL, [PRESCRIPTION_CLAUSE] [VARCHAR](500) NULL, [DAYS_DELAYED_FROM_PT] [VARCHAR](150) NULL, [PRESCRIBED] [VARCHAR](10) NULL, [LOA_NO] NVARCHAR(50) NULL, [LOA_AMOUNT] [varchar](150) NULL, [BATCH_REMARKS] [varchar](max) NULL, [BATCH_NOTE] [varchar](max) NULL, AMOUNT_ENCODED [VARCHAR](150) NULL ) IF @IsCount = 0 -- FOR BCP BEGIN IF object_id('tempdb..#OpenClaimCountTemp') IS NOT NULL BEGIN DROP TABLE #OpenClaimCountTemp END CREATE TABLE #OpenClaimCountTemp ( [RECEIVEDDATE] NVARCHAR(50) NULL,[PROVIDERCODE] [VARCHAR](150) NULL, [PROVIDERNAME] [VARCHAR](150) NULL, [COMPANY] [VARCHAR](250) NULL, [FUNDING_MGNT] [VARCHAR](50) NULL, [BATCHNO] NVARCHAR(50) NULL,[CLAIMNO] NVARCHAR(50) NULL, [PHYSICIAN_NAME] [VARCHAR](150) NULL, [PATIENT_NAME] [VARCHAR](150) NULL,[PAYORLINK_RECEIVED_DATE] NVARCHAR(50) NULL, [MAXICARE_RECEIVED_DATE] NVARCHAR(50) NULL, [AVAILMENT_DATE] NVARCHAR(50) NULL, [CLAIM_STATUS] [VARCHAR](150) NULL, [CLAIM_TYPE] [VARCHAR](150) NULL, [PROCESSOR] [VARCHAR](150) NULL, [NET_PAYABLE_AMOUNT] [VARCHAR](150) NULL, [NO._OF_DAYS_DELAYED] [VARCHAR](150) NULL , [ASSIGN_TO] [VARCHAR](150) NULL, [PPD] NVARCHAR(50) NULL, [PPD_DUE_DATE] NVARCHAR(50) NULL, [CREDIT_LIMIT] [VARCHAR](150) NULL, [PRESCRIPTION_TERM] [VARCHAR](250) NULL, [PRESCRIPTION_CLAUSE] [VARCHAR](500) NULL, [DAYS_DELAYED_FROM_PT] [VARCHAR](150) NULL, [PRESCRIBED] [VARCHAR](2) NULL, [LOA_NO] NVARCHAR(50) NOT NULL, [LOA_AMOUNT] [varchar](150) NULL, [BATCH_REMARKS] [varchar](max) NULL, [BATCH_NOTE] [varchar](max) NULL, AMOUNT_ENCODED [VARCHAR](150) NULL ) SET @QUERY = 'SELECT CORPCODE = m.CorpCode, PHYSICIANCODE = bh.PhysicianCode, CLAIMSTATUS = c.ClaimStatus, RECEIVEDDATE = ci.ReceivedDate, PROVIDERCODE = p.ProviderCode, PROVIDERNAME = p.ProviderName, BATCHNO = bh.BatchNo, CLAIMNO = c.ClaimNo, PATIENTNAME = c.PatientName, PAYORLINK_RECEIVED_DATE = CONVERT(varchar(20),ISNULL(bh.ReceivedDate,''01/01/1900''), 101), MAXICARE_RECEIVED_DATE = CONVERT(varchar(20),ISNULL(ci.ReceivedDate,''01/01/1900''), 101), AVAILMENT_DATE = CONVERT(varchar(20),ISNULL(c.AdmissionDate,''01/01/1900''), 101), CLAIMS_TYPE = CASE WHEN bh.ClaimType = ''IP'' THEN ''Hospital Bill Inpatient'' WHEN bh.ClaimType = ''OP'' THEN ''Hospital Bill Outpatient'' WHEN bh.ClaimType = ''PI'' THEN ''PF Inpatient'' WHEN bh.ClaimType = ''PO'' THEN ''PF Outpatient'' WHEN bh.ClaimType = ''RI'' THEN ''Reimbursement Inpatient'' WHEN bh.ClaimType = ''RO'' THEN ''Reimbursement Outpatient'' ELSE ''Invalid'' END, PROCESSOR = ci.UserID, [NO._OF_DAYS_DELAYED] = DATEDIFF(DD, ISNULL(ci.ReceivedDate, ''01/01/1900''), GETDATE()), ASSIGN_TO = bh.AssignTo, --PPD = ISNULL((SELECT TOP 1 PPD FROM ClaimsProcess.dbo.fxnPPDProvider5(P.ProviderCode,c.ClaimNo)),''N''), --PPD_DUE_DATE = ISNULL((SELECT TOP 1 DUEDATE FROM ClaimsProcess.dbo.fxnPPDProvider5(P.ProviderCode,c.ClaimNo)),''NONE''), PPD = ISNULL(PPD.PPD,''N''), PPD_DUE_DATE = ISNULL(convert(varchar(10),PPD.DUEDATE,101),''NONE''), CREDIT_LIMIT = ISNULL(p.CreditLimit,''''), PRESCRIPTION_TERM = ISNULL(p.PrescriptionTerm,''''), DAYS_DELAYED_FROM_PT = CASE WHEN p.PrescriptionTerm is null THEN '''' ELSE DATEDIFF(D,c.AdmissionDate,ci.ReceivedDate) - p.PrescriptionTerm END, PRESCRIBED = CASE WHEN ISNULL(p.PrescriptionTerm,'''') < DATEDIFF(D,c.AdmissionDate,ci.ReceivedDate) THEN ''Y'' ELSE ''N'' END, BATCH_REMARKS = bh.Remarks, BATCH_NOTE = ISNULL(bh2.Notes,''''), PRESCRIPTION_CLASE = ISNULL(p.PrescriptionClause,''''), AMOUNT_ENCODED = ISNULL(RC.TOTALDUE,0.00), CLAIMNO2 = ci.ClaimNo INTO #TempClaims FROM BatchHeader bh WITH (NOLOCK) INNER JOIN ClaimsInfo ci WITH (NOLOCK) ON bh.BatchNo = ci.BatchNo LEFT JOIN PPD ppd with(nolock) on ppd.BATCHNO = bh.BATCHNO INNER JOIN Claims c WITH (NOLOCK) ON ci.ClaimNo = c.ClaimNo INNER JOIN Members m WITH (NOLOCK) ON c.EmpID = m.EmpID INNER JOIN Provider p WITH (NOLOCK) ON bh.ProviderCode = p.ProviderCode LEFT JOIN vwVoidClaims vw WITH (NOLOCK) ON vw.CLAIMNO = c.ClaimNo LEFT JOIN CompanyTestAccount cta WITH (NOLOCK) ON m.CorpCode = cta.CorpCode LEFT JOIN Registration2.dbo.BatchHeader bh2 WITH(NOLOCK) ON bh.BatchNo = bh2.BatchNo LEFT JOIN REGISTRATION2..CLAIMS RC WITH(NOLOCK) ON RC.CLAIMNO = C.ORACLECLAIMNO AND RC.LOENO = C.AUTHORIZATIONCODE' IF @AssignTo = 'OTHER GROUPS' BEGIN SET @QUERY += ' WHERE c.ClaimStatus not in (''33'',''22'',''11'',''95'',''00'',''88'',''55'') AND bh.CreatedBy <> ''ELINK'' AND vw.CLAIMNO IS NULL AND bh.AssignTo in (''OP1'',''OP2'',''INFINIT-O'',''Head Office'',''MMC.ONLINECLAIMS'',''Reimbursement'') AND cta.CorpCode is null ORDER BY ci.ReceivedDate ASC' END IF @AssignTo = '' --UNASSIGNED/NULL BEGIN SET @QUERY += ' WHERE c.ClaimStatus not in (''33'',''22'',''11'',''95'',''00'',''88'',''55'') AND bh.CreatedBy <> ''ELINK'' AND vw.CLAIMNO IS NULL AND bh.AssignTo IS NULL AND cta.CorpCode is null ORDER BY ci.ReceivedDate ASC' END IF (@AssignTo not in ('','OTHER GROUPS'))-- NOT IN "OTHER GROUPS" OR "ASSIGNED/NULL" BEGIN SET @QUERY += ' WHERE c.ClaimStatus in(''01'',''08'',''19'',''25'',''40'',''51'',''89'',''90'',''91'',''96'',''98'',''99'') AND bh.CreatedBy = <> ''ELINK'' AND vw.CLAIMNO IS NULL AND bh.AssignTo = '''+@AssignTo +''' AND cta.CorpCode is null ORDER BY ci.ReceivedDate ASC' END SET @QUERY += ' INSERT INTO #OpenClaimCountTemp ( [RECEIVEDDATE],[PROVIDERCODE], [PROVIDERNAME], [COMPANY], [FUNDING_MGNT], [BATCHNO],[CLAIMNO], [PHYSICIAN_NAME], [PATIENT_NAME],[PAYORLINK_RECEIVED_DATE], [MAXICARE_RECEIVED_DATE], [AVAILMENT_DATE], [CLAIM_STATUS], [CLAIM_TYPE], [PROCESSOR],[NET_PAYABLE_AMOUNT],[NO._OF_DAYS_DELAYED], [ASSIGN_TO],[PPD], [PPD_DUE_DATE], [CREDIT_LIMIT],[PRESCRIPTION_TERM], [PRESCRIPTION_CLAUSE],[DAYS_DELAYED_FROM_PT], [PRESCRIBED],[LOA_NO], [LOA_AMOUNT], [BATCH_REMARKS], [AMOUNT_ENCODED] ) SELECT DISTINCT RECEIVEDDATE = o.RECEIVEDDATE, PROVIDERCODE = o.PROVIDERCODE, PROVIDERNAME = o.PROVIDERNAME, COMPANY = cm.CorpName, FUNDING_MNGT = CASE WHEN cp.FundingMgnt = ''A'' THEN ''ASO'' WHEN cp.FundingMgnt = ''F'' THEN ''Full Risk'' ELSE ISNULL(cp.FundingMgnt,'''') END, BATCHNO = o.BATCHNO, CLAIMNO = o.CLAIMNO, PHYSICIAN_NAME = ISNULL(pp.FullName,''''), PATIENT_NAME = o.PATIENTNAME, PAYORLINK_RECEIVED_DATE = o.PAYORLINK_RECEIVED_DATE, MAXICARE_RECEIVED_DATE = o.MAXICARE_RECEIVED_DATE, AVAILMENT_DATE = o.AVAILMENT_DATE, CLAIM_STATUS = css.ClaimDesc, CLAIMS_TYPE = o.CLAIMS_TYPE, PROCESSOR = ISNULL(o.PROCESSOR,''''), NET_PAYABLE_AMOUNT = ISNULL(vcs.ApprovedAmt - vcs.Deduction - vcs.ProviderExcess + vcs.MemberExcess,0), [NO._OF_DAYS_DELAYED] = o.[NO._OF_DAYS_DELAYED], ASSIGN_TO = o.ASSIGN_TO, PPD = o.PPD, PPD_DUE_DATE = o.PPD_DUE_DATE, CREDIT_LIMIT = o.CREDIT_LIMIT, PRESCRIPTION_TERM = o.PRESCRIPTION_TERM, PRESCRIPTION_CLAUSE = ISNULL(pc.PrescriptionClause,''''), DAYS_DELAYED_FROM_PT = o.DAYS_DELAYED_FROM_PT, PRESCRIBED = o.PRESCRIBED, LOA_NO = ISNULL(l.LOA_No,''''), LOA_AMOUNT = ISNULL(l.AssessedAmt,0), BATCH_REMARKS = o.BATCH_REMARKS, AMOUNT_ENCODED = o.AMOUNT_ENCODED FROM #TempClaims o INNER JOIN Company cm WITH (NOLOCK) ON cm.CorpCode = o.CORPCODE INNER JOIN CompanyPayment cp WITH (NOLOCK) ON o.CORPCODE = cp.CorpCode INNER JOIN FundingMgnt f with(NOLOCK) ON f.FundingMgnt = cp.FundingMgnt LEFT JOIN vClaimsSummary vcs WITH(NOLOCK) ON vcs.ClaimNo = o.CLAIMNO2 LEFT JOIN ClaimStatus css (NOLOCK) ON o.CLAIMSTATUS = css.ClaimStatus LEFT JOIN ClaimsSummaryGP csg WITH(NOLOCK) ON o.ClaimNo = csg.ClaimNo AND o.PhysicianCode = csg.PhysicianCode LEFT JOIN Physician pp WITH(NOLOCK) ON o.PHYSICIANCODE = pp.PhysicianCode LEFT JOIN LOA l WITH(NOLOCK) ON o.CLAIMNO = l.ClaimNo LEFT JOIN PrescriptionClause pc WITH(NOLOCK) ON o.PRESCRIPTION_CLASE = pc.RecId INSERT INTO #OpenClaimTemp ( [PROVIDERCODE], [PROVIDERNAME], [COMPANY], [FUNDING_MGNT], [BATCHNO],[CLAIMNO], [PHYSICIAN_NAME], [PATIENT_NAME] ,[PAYORLINK_RECEIVED_DATE] , [MAXICARE_RECEIVED_DATE] , [AVAILMENT_DATE], [CLAIM_STATUS], [CLAIM_TYPE], [PROCESSOR], [NET_PAYABLE_AMOUNT], [NO._OF_DAYS_DELAYED], [ASSIGN_TO], [PPD], [PPD_DUE_DATE], [CREDIT_LIMIT], [PRESCRIPTION_TERM], [PRESCRIPTION_CLAUSE], [DAYS_DELAYED_FROM_PT], [PRESCRIBED], [LOA_NO], [LOA_AMOUNT], [BATCH_REMARKS], [BATCH_NOTE], [AMOUNT_ENCODED] ) VALUES ( ''PROVIDERCODE'', ''PROVIDERNAME'', ''COMPANY'', ''FUNDING_MGNT'',''BATCHNO'',''CLAIMNO'', ''PHYSICIAN_NAME'', ''PATIENT_NAME'',''PAYORLINK_RECEIVED_DATE'' , ''MAXICARE_RECEIVED_DATE'' , ''AVAILMENT_DATE'',''CLAIM_STATUS'', ''CLAIM_TYPE'', ''PROCESSOR'', ''NET_PAYABLE_AMOUNT'', ''NO._OF_DAYS_DELAYED'',''ASSIGN_TO'', ''PPD'', ''PPD_DUE_DATE'', ''CREDIT_LIMIT'', ''PRESCRIPTION_TERM'', ''PRESCRIPTION_CLAUSE'', ''DAYS_DELAYED_FROM_PT'', ''PRESCRIBED'', ''LOA_NO'', ''LOA_AMOUNT'', ''BATCH_REMARKS'', ''BATCH_NOTE'', ''AMOUNT_ENCODED'' ) INSERT INTO #OpenClaimTemp ( [PROVIDERCODE], [PROVIDERNAME], [COMPANY], [FUNDING_MGNT], [BATCHNO],[CLAIMNO], [PHYSICIAN_NAME], [PATIENT_NAME] ,[PAYORLINK_RECEIVED_DATE] , [MAXICARE_RECEIVED_DATE] , [AVAILMENT_DATE], [CLAIM_STATUS], [CLAIM_TYPE], [PROCESSOR], [NET_PAYABLE_AMOUNT], [NO._OF_DAYS_DELAYED], [ASSIGN_TO], [PPD], [PPD_DUE_DATE], [CREDIT_LIMIT], [PRESCRIPTION_TERM], [PRESCRIPTION_CLAUSE], [DAYS_DELAYED_FROM_PT], [PRESCRIBED], [LOA_NO], [LOA_AMOUNT], [BATCH_REMARKS], [BATCH_NOTE], [AMOUNT_ENCODED] ) SELECT [PROVIDERCODE], [PROVIDERNAME], [COMPANY], [FUNDING_MGNT], [BATCHNO],[CLAIMNO], [PHYSICIAN_NAME], [PATIENT_NAME] ,[PAYORLINK_RECEIVED_DATE] , [MAXICARE_RECEIVED_DATE] , [AVAILMENT_DATE], [CLAIM_STATUS], [CLAIM_TYPE], [PROCESSOR], [NET_PAYABLE_AMOUNT], [NO._OF_DAYS_DELAYED], [ASSIGN_TO], [PPD], [PPD_DUE_DATE], [CREDIT_LIMIT], [PRESCRIPTION_TERM], [PRESCRIPTION_CLAUSE], [DAYS_DELAYED_FROM_PT], [PRESCRIBED], [LOA_NO], [LOA_AMOUNT], [BATCH_REMARKS], [BATCH_NOTE], [AMOUNT_ENCODED] FROM #OpenClaimCountTemp o ORDER BY o.RECEIVEDDATE ASC SELECT * FROM #OpenClaimTemp DROP TABLE #OpenClaimTemp DROP TABLE #TempClaims' PRINT @QUERY EXEC (@QUERY) END ELSE IF @IsCount = 1 BEGIN SELECT @COUNT = COUNT(o.CLAIMNO) FROM #OpenClaimCountTemp o WHERE ASSIGN_TO = @AssignTo AND CLAIM_STATUS = @ClaimStatus AND [NO._OF_DAYS_DELAYED] BETWEEN @DelayDaysFrom AND @DelayDaysTo PRINT @COUNT END ELSE IF @IsCount = 2 BEGIN SELECT @COUNT = COUNT(o.CLAIMNO) FROM #OpenClaimCountTemp o WHERE ASSIGN_TO = @AssignTo AND [NO._OF_DAYS_DELAYED] BETWEEN @DelayDaysFrom AND @DelayDaysTo PRINT @COUNT END END