我有一个相对简单的存储过程,但是事务表中的数据量导致它永远运行。任何关于我可以优化查询或将其转换为不使用游标的方式的建议将非常感激。
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
DECLARE @ItemID uniqueidentifier
SET @CurrentCount = 0;
DECLARE @TempTransTable TABLE
(
ID uniqueidentifier
)
-- Insert statements for procedure here
DECLARE curs_GetAllItems CURSOR LOCAL STATIC FORWARD_ONLY READ_ONLY FOR
select
ID
from
item
where
locationid in
(
-- gets corona locations
select
Locations.ID
from Locations
left outer join unit
on unit.locationid = locations.id
where unit.unittype = '4'
)
and stat not in (1,10,11,13) -- only items not in stock
OPEN curs_GetAllItems
FETCH NEXT FROM curs_GetAllItems INTO @ItemID
WHILE (@@FETCH_STATUS =0)
BEGIN
-- Clear table to ensure accurate data
DELETE FROM @TempTransTable
-- Insert transaction records to delete
-- Every transaction except the first two and the last
INSERT INTO @TempTransTable
select
ID
from
transactions
where
transactions.id not in
(select ID from (select top 2 * from transactions where itemid = @ItemID order by transdate asc) as t1
union
select ID from (select top 1 * from transactions where itemid = @ItemID order by transdate desc) as t2)
and itemid = @ItemID
-- Delete trans records
DELETE FROM
dbo.transactions
WHERE
transactions.ID in (select ID from @TempTransTable);
-- Get next item.id
FETCH NEXT FROM curs_GetAllItems INTO @ItemID
END
CLOSE curs_GetAllItems
DEALLOCATE curs_GetAllItems
END
答案 0 :(得分:1)
;with tmp as (
select *,
rn_asc = ROW_NUMBER() over (partition by t.itemid order by transdate asc),
rn_desc = ROW_NUMBER() over (partition by t.itemid order by transdate desc)
from transactions t
where exists (
select *
from item i
join Locations l on i.locationid = l.ID
join unit u on u.locationid = l.id and u.unittype = '4'
where i.id = t.itemid)
and stat not in (1,10,11,13) -- only items not in stock
)
delete tmp
where rn_asc > 2 and rn_desc > 1;
答案 1 :(得分:0)
我认为您应该检查一下您的方法。 应该可以在没有光标和循环的情况下进行管理。 可能是您需要使用中间临时表(考虑为其添加索引)。
其他观点:如果这些查询很难并且他们在数据库中进行并发更改,则可以轻松解决问题 - 锁定,超时和不一致的数据。