使用 SQL 插入或更新优化性能的策略
Strategy for optimizing performance with SQL Insert or Update
我使用以下存储过程来更新记录,或者如果记录不存在,则编写一个新记录。随着 table 的增长,我遇到了性能问题,想知道实现此目标的更好方法是什么。
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, '')
我想知道我是否应该直接插入最小索引 table,然后在幕后将数据移动到永久 table?我的研究不支持这种策略,但我不确定还有什么方法可行。
感谢您的帮助。
马克
虽然这没有您的代码,但我相信这正是您想要做的:
Using SQL Merge or UPDATE / INSERT
我认为 MERGE 会更快,但可能不会比它的一条记录快多少。
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, '' )
我使用以下存储过程来更新记录,或者如果记录不存在,则编写一个新记录。随着 table 的增长,我遇到了性能问题,想知道实现此目标的更好方法是什么。
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, '')
我想知道我是否应该直接插入最小索引 table,然后在幕后将数据移动到永久 table?我的研究不支持这种策略,但我不确定还有什么方法可行。
感谢您的帮助。
马克
虽然这没有您的代码,但我相信这正是您想要做的: Using SQL Merge or UPDATE / INSERT
我认为 MERGE 会更快,但可能不会比它的一条记录快多少。
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, '' )