-- first you need to add a column to SiteReconciliation to facilitate set-based updates
ALTER TABLE dbo.SiteReconciliation ADD TType int NULL
-- add these indexes
CREATE CLUSTERED INDEX [CL_sr] ON [dbo].[SiteReconciliation]
(
[SiteID] ASC,
[TankID] ASC,
[OpenDate] ASC,
[CloseDate] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
CREATE CLUSTERED INDEX [CL_std] ON [dbo].[SiteTankDeliveries]
(
[SiteID] ASC,
[TankID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
CREATE CLUSTERED INDEX [CL_sti] ON [dbo].[SiteTankInventory]
(
[SiteID] ASC,
[TankID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
CREATE NONCLUSTERED INDEX [IX_sti] ON [dbo].[SiteTankInventory]
(
[SiteID] ASC,
[TankID] ASC,
[InventoryDate] ASC
)
INCLUDE ( [InventoryGross],
[InventoryNet],
[WaterHeight],
[WaterVolume])
WHERE ([UseInRec]=(1))
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
CREATE CLUSTERED INDEX [CL_st] ON [dbo].[SiteTanks]
(
[SiteID] ASC,
[TankID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
CREATE NONCLUSTERED INDEX [IX_t] ON [dbo].[Transactions]
(
[SiteID] ASC
)
INCLUDE ( [Date],
[Time],
[Qty],
[Pump])
WHERE ([DontIncludeInRec]=(0))
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
-- here is another way to solve your problem with a set-based approach.
-- i don't know what your data looks like so you may have to make some modifications
-- * note i had to add a space when adding t.[Date]+ ' ' +t.[Time] below,
-- you might have to remove that as it is not in your original query
CREATE PROC [dbo].[stp_rpt_Reconciliation2]
@dParam1 datetime,
@dParam2 datetime,
@bUseTC bit
AS
SET NOCOUNT ON
BEGIN
TRUNCATE TABLE SiteReconciliation
INSERT SiteReconciliation(SiteID, TankID, OpenDate, CloseDate, OpenVolume, PolledInventory, WaterVol, WaterHeight, ProductID, TType, CalcDelivery, TotalBOL, MeteredSales, BlendedSales, Comment)
SELECT od.SiteID, od.TankID, od.InventoryDate, cd.InventoryDate, od.OpenVolume, cd.CloseVolume, cd.WaterVolume, cd.WaterHeight, st.ProdID, st.TType ,0 ,0 ,0 ,0, ''
FROM(
SELECT SiteID, TankID, InventoryDate, CASE @bUseTC
WHEN 1 THEN InventoryNet
ELSE InventoryGross
END [OpenVolume],
rn = ROW_NUMBER() OVER (PARTITION BY SiteID, TankID ORDER BY InventoryDate)
FROM SiteTankInventory
WHERE UseInRec=1
AND InventoryDate BETWEEN @dParam1 AND @dParam2
) od -- open date
JOIN
(
SELECT SiteID, TankID, InventoryDate, WaterHeight, WaterVolume, CASE @bUseTC
WHEN 1 THEN InventoryNet
ELSE InventoryGross
END [CloseVolume],
rn = ROW_NUMBER() OVER (PARTITION BY SiteID, TankID ORDER BY InventoryDate)
FROM SiteTankInventory
WHERE UseInRec=1
AND InventoryDate BETWEEN @dParam1 AND @dParam2
) cd -- close date
ON (od.SiteID = cd.SiteID AND od.TankID = cd.TankID AND cd.rn = od.rn + 1)
JOIN SiteTanks st ON (st.SiteID = od.SiteID AND st.TankID = od.TankID)
WHERE st.TType <> 4
UPDATE sr2
SET CalcDelivery = cd,
TotalBOL = tbol
FROM (
SELECT sr.SiteID, sr.TankID, sr.OpenDate, sr.CloseDate,
ISNULL(SUM(CASE @bUseTC WHEN 1 THEN ISNULL(std.DeliveredNet,0)
ELSE ISNULL(std.Delivered,0)
END) ,0)[cd],
ISNULL(SUM(ISNULL(std.BOL,0)),0)[tbol]
FROM SiteReconciliation sr
JOIN SiteTankDeliveries std ON (std.SiteID = sr.SiteID AND std.TankID = sr.TankID
AND std.DeliveryDate BETWEEN sr.OpenDate AND sr.CloseDate)
GROUP BY sr.SiteID, sr.TankID, sr.OpenDate, sr.CloseDate
)d
JOIN SiteReconciliation sr2 ON (sr2.SiteID = d.SiteID AND sr2.TankID = d.TankID
AND sr2.OpenDate = d.OpenDate AND sr2.CloseDate = d.CloseDate)
UPDATE sr2
SET MeteredSales = ms
FROM (
SELECT sr.SiteID, sr.TankID, sr.OpenDate, sr.CloseDate, ISNULL(SUM(CONVERT(FLOAT,ISNULL(Qty,0))),0)[ms]
FROM Transactions t
JOIN (
SELECT SiteID, TankID, Pump + RIGHT(Hose,1) [Pump]
FROM (SELECT SiteID, Pump, Hose1, Hose2, Hose3, Hose4, Hose5, Hose6, Hose7, Hose8 FROM SitePumps)p
UNPIVOT (TankID FOR Hose IN (Hose1, Hose2, Hose3, Hose4, Hose5, Hose6, Hose7, Hose8))unpvt
)sp
ON (sp.SiteID = t.SiteID AND sp.Pump = t.Pump)
JOIN SiteReconciliation sr ON (sp.SiteID = sr.SiteID AND sp.TankID = sr.TankID
AND CAST(t.[Date]+ ' ' +t.[Time] AS datetime) BETWEEN sr.OpenDate AND sr.CloseDate)
WHERE t.DontIncludeInRec = 0
GROUP BY sr.SiteID, sr.TankID, sr.OpenDate, sr.CloseDate
)d
JOIN SiteReconciliation sr2 ON (sr2.SiteID = d.SiteID AND sr2.TankID = d.TankID
AND sr2.OpenDate = d.OpenDate AND sr2.CloseDate = d.CloseDate)
UPDATE sr2
SET CalcDelivery = CalcDelivery + cd,
Comment = CASE WHEN SR2.TType IN (3,5,6)
THEN 'Delivery Calculated'
ELSE '' END
FROM (
SELECT sr.SiteID, sr.TankID, sr.OpenDate, sr.CloseDate, ISNULL(SUM(CONVERT(FLOAT,ISNULL(Qty,0))),0)[cd]
FROM Transactions t
JOIN (
SELECT SiteID, TankID, Pump + RIGHT(Hose,1) [Pump]
FROM (SELECT SiteID, Pump, Hose1, Hose2, Hose3, Hose4, Hose5, Hose6, Hose7, Hose8 FROM SitePumps)p
UNPIVOT (TankID FOR Hose IN (Hose1, Hose2, Hose3, Hose4, Hose5, Hose6, Hose7, Hose8))unpvt
)sp
ON (sp.SiteID = t.SiteID AND sp.Pump = t.Pump)
JOIN SiteReconciliation sr ON (sp.SiteID = sr.SiteID AND sp.TankID = sr.TankID
AND CAST(t.[Date]+ ' ' +t.[Time] AS datetime) BETWEEN sr.OpenDate AND sr.CloseDate)
JOIN SiteTankDeliveries std ON (std.SiteID = sr.SiteID AND std.TankID = sr.TankID
AND std.DeliveryDate BETWEEN sr.OpenDate AND sr.CloseDate)
WHERE t.DontIncludeInRec = 0
AND std.ChangedOrRecGauge = 0
AND CAST(t.[Date]+ ' ' +t.[Time] AS datetime) BETWEEN std.StartTime AND std.DeliveryDate
GROUP BY sr.SiteID, sr.TankID, sr.OpenDate, sr.CloseDate
)d
JOIN SiteReconciliation sr2 ON (sr2.SiteID = d.SiteID AND sr2.TankID = d.TankID
AND sr2.OpenDate = d.OpenDate AND sr2.CloseDate = d.CloseDate)
UPDATE sr2
SET OpenVolume = OpenVolume + ov
FROM (
SELECT sr.SiteID, sr.TankID, sr.OpenDate, sr.CloseDate,
ISNULL(SUM(CASE @bUseTC WHEN 1 THEN ISNULL(InventoryNet,0)
ELSE ISNULL(InventoryGross,0)
END) ,0)[ov]
FROM SiteTankInventory sti
JOIN SiteReconciliation sr ON (sr.SiteID = sti.SiteID AND sr.OpenDate = sti.InventoryDate)
WHERE sti.TankID IN(SELECT TankID
FROM SiteTanks
WHERE SiteID = sr.SiteID
AND Ttype = 4
AND PrimaryTankId = sr.TankID)
AND sti.UseInRec = 1
AND sr.TType IN (3,5,6)
GROUP BY sr.SiteID, sr.TankID, sr.OpenDate, sr.CloseDate
)d
JOIN SiteReconciliation sr2 ON (sr2.SiteID = d.SiteID AND sr2.TankID = d.TankID
AND sr2.OpenDate = d.OpenDate AND sr2.CloseDate = d.CloseDate)
UPDATE sr2
SET PolledInventory = PolledInventory + cv
FROM (
SELECT sr.SiteID, sr.TankID, sr.OpenDate, sr.CloseDate,
ISNULL(SUM(CASE @bUseTC WHEN 1 THEN ISNULL(InventoryNet,0)
ELSE ISNULL(InventoryGross,0)
END) ,0)[cv]
FROM SiteTankInventory sti
JOIN SiteReconciliation sr ON (sr.SiteID = sti.SiteID AND sr.CloseDate = sti.InventoryDate)
WHERE sti.TankID IN(SELECT TankID
FROM SiteTanks
WHERE SiteID = sr.SiteID
AND Ttype = 4
AND PrimaryTankId = sr.TankID)
AND sti.UseInRec = 1
AND sr.TType IN (3,5,6)
GROUP BY sr.SiteID, sr.TankID, sr.OpenDate, sr.CloseDate
)d
JOIN SiteReconciliation sr2 ON (sr2.SiteID = d.SiteID AND sr2.TankID = d.TankID
AND sr2.OpenDate = d.OpenDate AND sr2.CloseDate = d.CloseDate)
UPDATE sr2
SET BlendedSales = bs,
Comment = 'Primary Blend: ' + CONVERT(varchar(5),pbp) + '%'
FROM (
SELECT sr.SiteID, sr.TankID, sr.OpenDate, sr.CloseDate,
(ISNULL(SUM(CONVERT(FLOAT,ISNULL(Qty,0))),0) * CASE WHEN sr.TType = 1
THEN st.PrimBlendPercentage
ELSE (100 - st.PrimBlendPercentage) END)/100 [bs],
CASE WHEN sr.TType = 1
THEN st.PrimBlendPercentage
ELSE (100 - st.PrimBlendPercentage) END [pbp]
FROM Transactions t
JOIN (
SELECT SiteID, TankID, Pump + RIGHT(Hose,1) [Pump]
FROM (SELECT SiteID, Pump, Hose1, Hose2, Hose3, Hose4, Hose5, Hose6, Hose7, Hose8 FROM SitePumps)p
UNPIVOT (TankID FOR Hose IN (Hose1, Hose2, Hose3, Hose4, Hose5, Hose6, Hose7, Hose8))unpvt
)sp
ON (sp.SiteID = t.SiteID AND sp.Pump = t.Pump)
JOIN SiteTanks st ON (st.SiteID = sp.SiteID AND st.TankID = sp.TankID)
JOIN SiteReconciliation sr ON (st.SiteID = sr.SiteID AND st.PrimaryTankID = sr.TankID
AND CAST(t.[Date]+ ' ' +t.[Time] AS datetime) BETWEEN sr.OpenDate AND sr.CloseDate)
WHERE t.DontIncludeInRec = 0
AND sr.TType IN (1,5)
AND st.TType = 7
GROUP BY sr.SiteID, sr.TankID, sr.OpenDate, sr.CloseDate, sr.TType, st.PrimBlendPercentage
)d
JOIN SiteReconciliation sr2 ON (sr2.SiteID = d.SiteID AND sr2.TankID = d.TankID
AND sr2.OpenDate = d.OpenDate AND sr2.CloseDate = d.CloseDate)
UPDATE sr2
SET BlendedSales = bs,
Comment = 'Secondary Blend: ' + CONVERT(varchar(5),pbp) + '%'
FROM (
SELECT sr.SiteID, sr.TankID, sr.OpenDate, sr.CloseDate,
ISNULL(SUM(CONVERT(FLOAT,ISNULL(Qty,0))),0) * (100 - st.PrimBlendPercentage)/100 [bs],
(100 - st.PrimBlendPercentage) [pbp]
FROM Transactions t
JOIN (
SELECT SiteID, TankID, Pump + RIGHT(Hose,1) [Pump]
FROM (SELECT SiteID, Pump, Hose1, Hose2, Hose3, Hose4, Hose5, Hose6, Hose7, Hose8 FROM SitePumps)p
UNPIVOT (TankID FOR Hose IN (Hose1, Hose2, Hose3, Hose4, Hose5, Hose6, Hose7, Hose8))unpvt
)sp
ON (sp.SiteID = t.SiteID AND sp.Pump = t.Pump)
JOIN SiteTanks st ON (st.SiteID = sp.SiteID AND st.TankID = sp.TankID)
JOIN SiteReconciliation sr ON (st.SiteID = sr.SiteID AND st.SecondaryTankID = sr.TankID
AND CAST(t.[Date]+ ' ' +t.[Time] AS datetime) BETWEEN sr.OpenDate AND sr.CloseDate)
WHERE t.DontIncludeInRec = 0
AND sr.TType = 2
AND st.TType = 7
GROUP BY sr.SiteID, sr.TankID, sr.OpenDate, sr.CloseDate, sr.TType, st.PrimBlendPercentage
)d
JOIN SiteReconciliation sr2 ON (sr2.SiteID = d.SiteID AND sr2.TankID = d.TankID
AND sr2.OpenDate = d.OpenDate AND sr2.CloseDate = d.CloseDate)
END
can Somebody modify the stored procedure for good performance please
In short, No.
This is a forum where we try to help people with problems work out how to resolve those problems. There is no payment for giving answers here, other than getting 'karma' points from people who click the tick or vote up answers are grateful for the assistance they got.
So far we have only seen this one section of code. We have no idea about the rest of the database or the system(s) that works with it. To diagnose and resolve an issue we need more than this 600 lines of code. If the advise you have so far doesnt help guide you to new resources or provide ideas on creating a fix then it may be that you need to wait a while for other answers to come along.
If you want your work done for you then that changes the whole scenario and you need to hire one of us as a contractor to work specifically on your system to resolve the issue you have.
There are people here that might be able to do this and I'll leave it up to them to volunteer their services. Alternately you could look to hire a contractor.
I'm sorry if this sounds blunt or unhelpful bet we are all working our own jobs and visit here to help out in a few spare minutes each day.
In order to completely rewrite this procedure, it would take hours and I would have to have access to your database in order to test the results as I went along. In short, it would have to be a paid consulting gig with a contract. There's just too much here.
Take some of the suggestions and run with them. Or, find a consultant who knows how to do this and hire them.