In case you have your own slow SQL query, you can optimize it automatically here.
For the query above, the following recommendations will be helpful as part of the SQL tuning process.
You'll find 3 sections below:
CREATE INDEX crd1_idx_adrestype_cardcode_address ON crd1 (adrestype,cardcode,address);
CREATE INDEX inv1_idx_docentry ON inv1 (docentry);
CREATE INDEX ocrd_idx_cardcode ON ocrd (cardcode);
CREATE INDEX ocrd_idx_cardtype ON ocrd (cardtype);
CREATE INDEX oinv_idx_cardcode ON oinv (cardcode);
CREATE INDEX orin_idx_cardcode ON orin (cardcode);
CREATE INDEX oslp_idx_slpcode ON oslp (slpcode);
CREATE INDEX rin1_idx_docentry ON rin1 (docentry);
SELECT
x.cardcode,
x.customer,
CASE
WHEN x.rep IS NULL THEN (SELECT
slpname
FROM
ocrd
INNER JOIN
oslp
ON ocrd.slpcode = oslp.slpcode
WHERE
ocrd.cardcode = x.cardcode)
ELSE x.rep END AS rep,
x.city,
x.state,
x.country,
CASE
WHEN isnumeric(x.total) = 0 THEN 0
ELSE x.total END AS [net total],
x.docdate
FROM
(SELECT
t0.cardcode AS cardcode,
t0.[cardname] AS customer,
t1.city AS city,
t1.state AS state,
t1.country AS country,
t4.slpname AS rep,
sum(t3.linetotal) - t2.discsum AS total,
t2.docdate AS [docdate]
FROM
ocrd t0
INNER JOIN
crd1 t1
ON (
t0.cardcode = t1.cardcode
AND t0.shiptodef = t1.address
)
LEFT OUTER JOIN
oinv t2
ON t0.cardcode = t2.cardcode
LEFT OUTER JOIN
inv1 t3
ON t2.docentry = t3.docentry
LEFT OUTER JOIN
oslp t4
ON t2.slpcode = t4.slpcode
WHERE
(
t0.[cardtype] = 'C'
AND t1.adrestype = 'S'
)
AND (
t2.docdate BETWEEN '2008/01/01' AND dateadd(day, -1, '2008/' + CAST(month(getdate()) AS varchar (2)) + '/01')
OR t2.docdate BETWEEN '2009/01/01' AND dateadd(day, -1, '2009/' + CAST(month(getdate()) AS varchar (2)) + '/01')
OR t2.docdate BETWEEN '2010/01/01' AND dateadd(day, -1, '2010/' + CAST(month(getdate()) AS varchar (2)) + '/01')
)
GROUP BY
t0.cardcode,
t0.cardname,
t1.city,
t1.state,
t1.country,
t4.slpname,
t2.discsum,
t2.docdate
UNION
ALL SELECT
t0.cardcode AS cardcode,
t0.cardname AS customer,
t1.city AS city,
t1.state AS state,
t1.country AS country,
t4.slpname AS rep,
-1 * (sum(t3.linetotal) - t2.discsum) AS total,
t2.docdate
FROM
ocrd t0
INNER JOIN
crd1 t1
ON (
t0.cardcode = t1.cardcode
AND t0.shiptodef = t1.address
)
LEFT OUTER JOIN
orin t2
ON t0.cardcode = t2.cardcode
LEFT OUTER JOIN
rin1 t3
ON t2.docentry = t3.docentry
LEFT OUTER JOIN
oslp t4
ON t2.slpcode = t4.slpcode
WHERE
(
t0.[cardtype] = 'C'
AND t1.adrestype = 'S'
)
AND (
t2.docdate BETWEEN '2008/01/01' AND dateadd(day, -1, '2008/' + CAST(month(getdate()) AS varchar (2)) + '/01')
OR t2.docdate BETWEEN '2009/01/01' AND dateadd(day, -1, '2009/' + CAST(month(getdate()) AS varchar (2)) + '/01')
OR t2.docdate BETWEEN '2010/01/01' AND dateadd(day, -1, '2010/' + CAST(month(getdate()) AS varchar (2)) + '/01')
)
GROUP BY
t0.cardcode,
t0.cardname,
t1.city,
t1.state,
t1.country,
t4.slpname,
t2.discsum,
t2.docdate
) x
WHERE
(
1 = 1
)
GROUP BY
x.cardcode,
x.customer,
x.rep,
x.city,
x.state,
x.country,
x.total,
x.docdate