I have a very complex SQL View. My Problem is, that its very slow and need a lot of memory When i want to make a report.
What the View do:
It queries a total value and multiply it with a factor
Obviously it’s because it contains a lot subqueries… (9 if you count it)
The query runs on a system with Millions of datasets.
My question. Where are points to optimize it? Would it be faster, if i make prepared procedures oder create sql views for the subqueries?
SELECT
CASE BID WHEN 1 THEN
b.TOTAL
ELSE
(b.TOTAL * - 1)
END
*
CASE WHEN
(SELECT
(CAST(DATEDIFF(day,
ISNULL
((SELECT dbo.TableA.TimestampFrom + 1 AS start FROM dbo.TableB INNER JOIN
dbo.TableA ON dbo.TableB.SID = dbo.TableA.SID
WHERE (dbo.TableB.PID = dbo.TableC.PID) AND
(dbo.TableB.MString = 'S' OR dbo.TableB.MString = 'ST') AND
(dbo.TableB.TimestampCreated <
(SELECT TimestampCreated
FROM dbo.TableB AS TableB_2
WHERE (RID = dbo.TableC.RID)))
AND
(dbo.TableB.VPFrom =
(SELECT VPFrom FROM dbo.TableB AS TableB_1
WHERE (RID = dbo.TableC.RID))
)), VPFrom), VPTo)
AS Float) + 1)
/
(CAST(DATEDIFF(day, start, Vertragsende) AS Float) + 1) AS Faktor
FROM dbo.TableC
WHERE (LaufNr = b.LaufNr))
> 1
THEN
1
ELSE
(SELECT (CAST(DATEDIFF(day,
ISNULL
((SELECT dbo.TableA.TimestampFrom + 1 AS start FROM dbo.TableB INNER JOIN
dbo.TableA ON dbo.TableB.SID = dbo.TableA.SID
WHERE (dbo.TableB.PID = dbo.TableC.PID) AND
(dbo.TableB.MString = 'S' OR dbo.TableB.MString = 'ST') AND
(dbo.TableB.TimestampCreated <
(SELECT TimestampCreated FROM dbo.TableB AS TableB_2
WHERE (RID = dbo.TableC.RID)))
AND (dbo.TableB.VPFrom =
(SELECT VPFrom FROM dbo.TableB AS TableB_1
WHERE (RID = dbo.TableC.RID)))
), VPFrom),VPTo) AS Float) + 1)
/ (CAST(DATEDIFF(day, start, Vertragsende) AS Float) + 1) AS Faktor
FROM dbo.TableC
WHERE (LaufNr = b.LaufNr))
END AS GrossPremium
,RID, PID, ONR, OPosLaufNr, LaufNr, bdate
FROM dbo.TableC AS b
The rules of thumb for indexing are to
then think about adding an index to
In some cases, one multi-column index will be faster in SELECT statements than several single-column indexes.
Then, make sure your WHERE clauses are sargable.
Finally, it does make sense to try converting some of the subqueries into views for testing. My guess is that the root cause of the problem is that you’re executing different subqueries depending on the return value of several CASE statements.