Actually, I am a not sure do the SQL Server utilized the indexes but could be sure that I have to make the index on all primary keys.
Below SQL statement is worked but just take some time to finish, talking about 3 hours at lease. While the SQL is running there is no any other application can run properly.
I do think the problem is come from 2 points,
1. Union, it might take much time on merging data. According to the execution plan, most of all resource is spent to Union.
2. Left outer join, it is also waste server resource to process.
Below SQL statement involved 4 unions the first three SQL is running quite first, around 1 or 2 mins. The last two is the main problem; I have run each SQL individually.
All data around 50,000 records roughly the server only have 1 CPU, PIII and 128M Ram. Hard disk around 10GB and the data file is stored in local drive.
SELECT C.case_no AS CaseNo,
C.status AS Status,
'' AS VchDate,
'' AS VchType,
'' AS VchNo,
Nature,
BaseAmt,
C.solicitor Solicitor
FROM tb_case C
INNER JOIN (SELECT case_no,
'O' AS Nature,
SUM(CASE dc_typ WHEN 'D' THEN amt
WHEN 'C' THEN -1 * amt END) AS BaseAmt
FROM tb_case_o_open
GROUP BY case_no,
dc_typ) D
ON C.case_no = D.case_no
UNION
SELECT C.case_no AS CaseNo,
C.status AS Status,
'' AS VchDate,
'' AS VchType,
'' AS VchNo,
Nature,
BaseAmt,
C.solicitor Solicitor
FROM tb_case C
INNER JOIN (SELECT case_no,
'D' as Nature,
SUM(CASE dc_typ WHEN 'D' THEN amt
WHEN 'C' THEN -1 * amt END) AS BaseAmt
FROM tb_case_d_open
GROUP BY case_no) E
ON C.case_no = E.case_no
UNION
SELECT C.case_no AS CaseNo,
C.status AS Status,
'' AS VchDate,
'' AS VchType,
'' AS VchNo,
Nature,
BaseAmt,
C.solicitor Solicitor
FROM tb_case C
INNER JOIN (SELECT case_no,
'C' AS Nature,
SUM(CASE dc_typ WHEN 'D' THEN amt
WHEN 'C' THEN -1 * amt END) AS BaseAmt
FROM tb_case_c_open
GROUP BY case_no,
dc_typ) F
ON C.case_no = F.case_no
UNION
SELECT C.case_no AS CaseNo,
C.status AS Status,
B.vch_dte AS VchDate,
A.vch_typ AS VchType,
A.vch_no AS VchNo,
A.nature AS Nature,
-ISNULL(base_amt, 0) AS BaseAmt,
C.solicitor Solicitor
FROM tb_case C
LEFT JOIN tb_sub_gl A
ON A.case_no = C.case_no
AND dc_typ = 'C'
LEFT JOIN tb_gl_hd B
ON ((A.vch_typ = B.vch_typ
AND A.vch_no = B.vch_no
AND A.vch_seq = B.vch_seq)
OR ((A.bill_typ = 'PB'
OR A.bill_typ = 'CN')
AND A.bill_typ = B.vch_typ
And A.bill_no = B.vch_no))
AND in_dte > = '2002-04-01 00:00:00'
UNION
SELECT C.case_no AS CaseNo,
C.status AS Status,
B.vch_dte AS VchDate,
A.vch_typ AS VchType,
A.vch_no AS VchNo,
A.nature AS Nature,
ISNULL(base_amt, 0) AS BaseAmt,
C.solicitor Solicitor
FROM tb_case C
LEFT JOIN tb_sub_gl A
ON A.case_no = C.case_no
AND dc_typ = 'D'
LEFT JOIN tb_gl_hd B
ON ((A.vch_typ = B.vch_typ
AND A.vch_no = B.vch_no
AND A.vch_seq = B.vch_seq)
OR ((A.bill_typ = 'PB'
OR A.bill_typ = 'CN')
AND A.bill_typ = B.vch_typ
And A.bill_no = B.vch_no))
AND in_dte > = '2002-04-01 00:00:00'
ORDER BY CaseNo,
VchDate,
VchType,
VchNo,
Nature