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