以下哪个查询表现良好?

时间:2013-06-07 07:29:21

标签: sql sql-server query-performance

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

  1. 此查询将在一天内被调用几千到几十万次,并且可以是插入操作或更新操作。
  2. - 有一个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
    

    感谢。

2 个答案:

答案 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。两个查询中的条件参数只是聚集索引的一部分,因此在整体性能方面没有太大差异。

感谢大家的投入。