进一步优化SQL Server存储过程

进一步优化SQL Server存储过程,sql,sql-server,database,tsql,race-condition,Sql,Sql Server,Database,Tsql,Race Condition,如何进一步优化/重构此存储过程 性能改进在哪里 ALTER PROCEDURE cc_test_setnumber @UUID AS VARCHAR(50), @Status AS VARCHAR(50) AS BEGIN SET NOCOUNT ON; SET TRANSACTION ISOLATION LEVEL SERIALIZABLE IF @Status = 'ACTIVE' BEGIN DECLARE @Tb

如何进一步优化/重构此存储过程

性能改进在哪里

ALTER PROCEDURE cc_test_setnumber
    @UUID AS VARCHAR(50),
    @Status AS VARCHAR(50)
AS
BEGIN
    SET NOCOUNT ON;
    SET TRANSACTION ISOLATION LEVEL SERIALIZABLE    

    IF @Status = 'ACTIVE'  
    BEGIN
       DECLARE @Tbl AS TABLE (UUID VARCHAR(50))

       BEGIN TRANSACTION 

       UPDATE dbo.cc_testagents 
       SET Status = 'INCALL', LastUpdated = GETDATE() 
       OUTPUT INSERTED.UUID INTO @Tbl
       WHERE ID = (SELECT TOP 1 ID FROM dbo.cc_testagents WHERE Status = 'IDLE')    

       UPDATE cc_testnumbers 
       SET Status = 'ACTIVE', 
           AgentUUID = (SELECT UUID FROM @Tbl) 
       OUTPUT INSERTED.AgentUUID AS 'UUID'
       WHERE CallUUID = @UUID   

       COMMIT TRANSACTION
END  
ELSE --BUSY, WRAPUP, NOANSWER, NOAGENT
BEGIN      
       UPDATE dbo.cc_testagents  
       SET Status = 'WRAPUP' 
       WHERE UUID = (SELECT AgentUUID FROM dbo.cc_testnumbers WHERE CallUUID = @UUID)

       SELECT @Status = REPLACE(@Status, 'NOAGENT', 'IDLE')

       UPDATE dbo.cc_testnumbers 
       SET Status = @Status, CallUUID = '' 
       WHERE CallUUID = @UUID
    END 
END

在SQLServerManagementStudio中,“数据库引擎优化顾问”是一个很好的起点—不仅对于此存储过程,而且对于针对这些表运行的任何其他查询都是如此

如果不了解更多关于表结构和其他正在争夺这些表上锁的查询的信息,就很难给出具体的建议。确保cc_testagents.ID、cc_testagents.uuid、cc_testnumbers.uid上有聚集/非聚集索引


如果您遇到死锁问题,并且有从cc_testagents/cc_testnumbers读取的查询可以容忍读取未提交的数据,那么一个快速而肮脏的“修复”方法是在这些select语句上使用nolock hint/set transaction ISOLATE level read UNCOMMITED。根据你问的人,这被认为是一种不好的做法,如果你在生产中遇到一些严重的死锁问题,就把它扔出去作为一种可能会阻碍你的事情。

如果这是你的代码,并且是你所能想到的最好的,那么应该在网站上问这个问题。或者,您是在询问如何总体优化SPs?