使用SQL插入或更新优化性能的策略

使用SQL插入或更新优化性能的策略,sql,performance,insert,Sql,Performance,Insert,我使用以下存储过程来更新记录,或者如果记录不存在,则编写一个新的记录。随着表格的增长,我遇到了性能问题,我想知道有什么更好的方法来实现这一点 CREATE PROCEDURE [dbo].[spCheckSheet_QuestionRecordsInsertOrUpdatePrimary] @QuestionPrimaryValue varchar(50), @QuestionID int, @CSRecordID int AS UPDATE tbCheckS

我使用以下存储过程来更新记录,或者如果记录不存在,则编写一个新的记录。随着表格的增长,我遇到了性能问题,我想知道有什么更好的方法来实现这一点

CREATE PROCEDURE [dbo].[spCheckSheet_QuestionRecordsInsertOrUpdatePrimary]
    @QuestionPrimaryValue varchar(50),  
    @QuestionID int,
    @CSRecordID int
AS
    UPDATE tbCheckSheet_QuestionRecords
    SET [QuestionPrimaryValue] = @QuestionPrimaryValue
    WHERE [CSRecordID] = @CSRecordID AND [QuestionID] = @QuestionID

    IF @@ROWCOUNT = 0
       INSERT INTO tbCheckSheet_QuestionRecords ([CSRecordID], [QuestionID], [QuestionPrimaryValue], [QuestionSecondaryValue])
       VALUES (@CSRecordID, @QuestionID, @QuestionPrimaryValue, '')   
我想知道我是否应该直接插入一个索引最少的表,然后在幕后将数据移动到永久表中?我的研究不支持这一策略,但我不确定还有什么能奏效

谢谢你的帮助


Mark

虽然这没有您的代码,但我相信这正是您要做的:

我认为合并会更快,但可能不会比它的一个记录快那么多

CREATE PROCEDURE [dbo].[spCheckSheet_QuestionRecordsInsertOrUpdatePrimary] 
@QuestionPrimaryValue varchar(50),  
@QuestionID int,
@CSRecordID int
AS
MERGE tbCheckSheet_QuestionRecords
AS TARGET
    USING (
           SELECT @QuestionPrimaryValue
                , @QuestionID
                , @CSRecordID
          ) AS SOURCE (QuestionPrimaryValue, QuestionID, CSRecordID)
    ON (TARGET.QuestionID = SOURCE.QuestionID
        AND TARGET.CSRecordID = SOURCE.CSRecordID)
    WHEN MATCHED THEN 
        UPDATE SET QuestionPrimaryValue = SOURCE.CSRecordID
                 , QuestionSecondaryValue = ''
    WHEN NOT MATCHED THEN
        INSERT (CSRecordID, QuestionID, QuestionPrimaryValue, QuestionSecondaryValue)
        VALUES (SOURCE.CSRecordID, SOURCE.QuestionID, SOURCE.QuestionPrimaryValue, '' )

除非大多数过程调用都在现有记录上,否则我认为应该执行if exists()更新。。。否则插入。。。会更快。这是用于哪个RDBMS的?无论您使用的是MySQL、PostgreSQL、Oracle、SQL Server还是IBM DB2,甚至是其他什么,这通常都会产生影响。请在您的问题中添加相关标签!Sql server。谢谢