我试图了解在下面两个查询中,一个查询中是否存在任何性能优势。感谢您的帮助以理解这一点。
- 有一个CLUSTERED INDEX ON TYPE,ID ON XYZ表
查询1:
DECLARE @paramDef NVARCHAR(1000)
DECLARE @columnName NVARCHAR(100)
SET @paramDef = '@Type nvarchar(100), @Id INT'
SET @columnValue = 'testField'
SET @strSql =
N'IF NOT EXISTS(SELECT 1 FROM XYZ WITH (NOLOCK) WHERE Type = @Type AND ID = @Id)
BEGIN
.... insert into XYZ code
END
ELSE IF EXISTS (SELECT 1 FROM XYZ WITH (NOLOCK) WHERE Type = @ReferenceType AND Id = @Id
AND ' + @columnname + ' IS NULL)
BEGIN
.... update to XYZ code
END'
sp_executesql @strSql, @paramDef, @Type = 'abc', @Id = '123'
或查询2
DECLARE @paramDef NVARCHAR(100)
DECLARE @columnName NVARCHAR(100)
SET @paramDef = 'DECLARE @rowExists nvarchar(100), @columnValue nvarchar(100), @Type nvarchar(100), @Id INT'
SET @columnValue = 'testField'
SET @strSql =
N'SELECT @rowExists = 1, @columnValue=' + @columnname + ' FROM XYZ WITH (NOLOCK) WHERE Type = @Type AND ID = @Id
IF (@rowExists IS NULL) --row does not exists then insert
BEGIN
.... insert into XYZ code
END
ELSE IF (@rowExists = 1 and @columnValue IS NULL)
BEGIN
.... update to XYZ code
END'
sp_executesql @strSql, @paramDef, @Type = 'abc', @Id = '123', @rowExists = NULL, @columnValue = NULL
感谢。
答案 0 :(得分:0)
关于查询2请快速使用合并! MERGE表AS TARGET 使用(某些值)AS SOURCE ON(TARGET.ID = SOURCE.ID和target.type = source.type) 匹配时和TARGET.columnvalue<> SOURCE.columnvalue 然后 UPDATE SET TARGET.columnvalue = SOURCE.columnvalue 当没有与目标相匹配时 INSERT(ID,类型,列值) VALUES(SOURCE.ID,SOURCE.type,SOURCE.columnvalue)
答案 1 :(得分:0)
我们尝试使用下面的方法测试这两个查询,并尝试多次运行它以进行插入和更新。
SET STATISTICS TIME ON SET STATISTICS IO ON
通过这个分析,它发现只有第一次查询花费更多时间(虽然5毫秒),但随后计划重用两者执行几乎相同(1毫秒)。有了这个,我们选择了Query2,其中只有一个select用于Inserts / Updates,在Query1中,在更新的情况下将有两个select。两个查询中的条件参数只是聚集索引的一部分,因此在整体性能方面没有太大差异。
感谢大家的投入。