0

我试图了解一个查询是否比以下两个查询中的另一个查询有任何性能优势。感谢您帮助理解这一点。

  1. 这个查询一天会被调用几千到几十万次,可以是插入操作,也可以是更新操作。

--有一个CLUSTERED INDEX ON TYPE,ID ON XYZ table

查询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

谢谢。

4

2 回答 2

0

关于查询2请使用合并快速!MERGE table AS TARGET USING (一些值) AS SOURCE ON (TARGET.ID = SOURCE.ID and target.type=source.type) WHEN MATCHED AND TARGET.columnvalue<> SOURCE.columnvalue THEN UPDATE SET TARGET.columnvalue= SOURCE.columnvalue当目标不匹配时,插入(ID、类型、列值)值(SOURCE.ID、SOURCE.type、SOURCE.columnvalue)

于 2013-06-07T10:04:18.140 回答
0

我们尝试使用下面的查询测试并尝试多次运行它以进行插入和更新。

SET STATISTICS TIME ON SET STATISTICS IO ON

通过此分析,它发现只有第一次查询花费了更多时间(尽管 5 毫秒),但随后计划重用的执行几乎相同(1 毫秒)。有了这个,我们选择了 Query2,在插入/更新的情况下只使用一个选择,而在 Query1 中,在更新的情况下将有两个选择。两个查询中的条件参数只是聚集索引的一部分,因此整体性能没有太大差异。

感谢大家的投入。

于 2013-06-08T21:14:36.007 回答