Sql server 从我的数据库(SQL server)中的一个表中删除的速度很慢

Sql server 从我的数据库(SQL server)中的一个表中删除的速度很慢,sql-server,Sql Server,我有一个表,其中有两个用于插入和更新的触发器。记录编号为700000,从表中删除的速度很慢,对于用于插入和更新后的触发器,是否会出现此问题 我的触发器: ALTER TRIGGER [dbo].[FillFinallAmount_UpdateTR] ON [dbo].[StuffPriceInfo] after Update AS --declare var select @fatherid=i.FatherPriceInfoId from inserted i; sele

我有一个表,其中有两个用于插入和更新的触发器。记录编号为700000,从表中删除的速度很慢,对于用于插入和更新后的触发器,是否会出现此问题

我的触发器:

ALTER TRIGGER [dbo].[FillFinallAmount_UpdateTR] ON [dbo].[StuffPriceInfo] 
after Update AS 
--declare var
    select @fatherid=i.FatherPriceInfoId from inserted i; 
    select @priceid=i.PriceInfoId from inserted i; 
    select @stuffcodeseq=i.stuffcodeseq from inserted i; 
    select @StuffServiceCode=i.StuffServiceCode from inserted i; 
    select @PriceType=i.PriceType from inserted i; 
    select @TaskType=i.TaskType from inserted i; 
    select @basepercent=i.basepercent from inserted i; 
    select @NewAmount=i.NewAmount from inserted i; 
    select @FinalAmount=i.FinalAmount from inserted i; 
    select @dbasepercent=i.basepercent from deleted i; 
    select @dNewAmount=i.NewAmount from deleted i; 
    select @dFinalAmount=i.FinalAmount from deleted i; 
    select @dfatherid=i.FatherPriceInfoId from deleted i; 
    IF(@dbasepercent!=@basepercent or @dNewAmount!=@NewAmount or @dFinalAmount!=@FinalAmount or @dfatherid!=@fatherid) 
    BEGIN 
        IF update(FatherPriceInfoId) 
        BEGIN 
            IF @fatherid is not null 
            BEGIN 
                set @fatheramount=(select FinalAmount from StuffPriceInfo where PriceInfoId=@fatherid) 
                set @FinalAmount=((@fatheramount*@basepercent*0.01)+@NewAmount) 
                update StuffPriceInfo set FinalAmount=@FinalAmount where PriceInfoId=@priceid 
                update StuffPriceInfo set FinalAmount=((@FinalAmount*basepercent*0.01)+NewAmount)   where FatherPriceInfoId=@priceid 
            END 
            else 
            begin 
                update StuffPriceInfo set FinalAmount=@NewAmount where PriceInfoId=@priceid 
                update StuffPriceInfo set FinalAmount=((@NewAmount*basepercent*0.01)+NewAmount)   where FatherPriceInfoId=@priceid 
            END 
        END 
        ELSE if update(basepercent) 
        BEGIN 
            IF @fatherid is not null 
            BEGIN 
                SET @fatheramount=(select FinalAmount from StuffPriceInfo where PriceInfoId=@fatherid) 
                SET @FinalAmount=((@fatheramount*@basepercent*0.01)+@NewAmount) 
                UPDATE StuffPriceInfo set FinalAmount=@FinalAmount where PriceInfoId=@priceid 
                UPDATE StuffPriceInfo set FinalAmount=((@FinalAmount*basepercent*0.01)+NewAmount)   where FatherPriceInfoId=@priceid 
            END 
            ELSE 
            BEGIN 
                UPDATE StuffPriceInfo set FinalAmount=@NewAmount where PriceInfoId=@priceid 
                UPDATE StuffPriceInfo set FinalAmount=((@NewAmount*basepercent*0.01)+NewAmount)   where FatherPriceInfoId=@priceid 
            END 
        END 

AND .....

通过为与“PriceInfoId”列相关的“FatherPriceInfoId”列创建索引(两列在同一个表中,“PriceInfoId”是主键)来解决此问题。

触发器的DDL是什么?我们这里没有足够的信息,您能添加更多信息吗?考虑到您在触发器末尾有
和……
,这还不是全部。我怀疑你的扳机很大。我怀疑这只是问题的一部分。不过触发器有几个问题,首先,它假设一次只更新一行,而不应该。您可以一次更新多行。此外,您还可以同时分配多个变量:例如
从插入的i中选择@fatherid=i.FatherPriceInfoId、@priceid=i.PriceInfoId
但是,该方法无论如何都不是您想要使用的,因为(再次)假定
inserted
只包含一行。老实说,如果没有完整的触发器,这个问题将很难解决。然而,根本原因是,您似乎在使用触发器进行编程思考。您没有考虑需要
更新的数据,而是考虑需要
更新的每一行和每一列,并独立完成每一行和每一列。SQL Server的forté正在成套运行。你的触发器基本上是有缺陷的(只接受一行),但要让它正常工作(可能)会有很多问题;如果没有完整的触发、样本和预期结果,就无法实现某些目标。