T-SQL,计划作业中的多个更新

T-SQL,计划作业中的多个更新,sql,performance,sql-server-2008,tsql,database-performance,Sql,Performance,Sql Server 2008,Tsql,Database Performance,我一直在开发一个用作计划作业的查询。简而言之,我将对一个表进行一些特定的计算,并根据计算结果更新一些列(如STATE) 样本(目前的情况)可演示如下: 我试图在上面演示的是查询的流程。正如上面所看到的,我多次更新一个表,主要是设置一个状态列,根据不同的条件使用不同的值 我还必须使用while循环,而不是游标(因为性能很差),因为根据这些条件,需要使用小组来更新此表中的数据 假设所有查询都包装在一个事务和一个try-catch块中 最后,我的问题是: 因为这将是一个安排在晚上执行的工作,性能不

我一直在开发一个用作计划作业的查询。简而言之,我将对一个表进行一些特定的计算,并根据计算结果更新一些列(如STATE)

样本(目前的情况)可演示如下:



我试图在上面演示的是查询的流程。正如上面所看到的,我多次更新一个表,主要是设置一个状态列,根据不同的条件使用不同的值

我还必须使用while循环,而不是游标(因为性能很差),因为根据这些条件,需要使用小组来更新此表中的数据

假设所有查询都包装在一个事务和一个try-catch块中

最后,我的问题是: 因为这将是一个安排在晚上执行的工作,性能不是我的首要任务。但是,我不知道如何使用更干净、更高效(性能方面)的查询进行相同的操作。我需要一些建议。 请注意,{some condition}区域包含具有EXISTS功能的子查询。所以原始代码看起来比这更混乱。提前谢谢。
--Ozan

如果表足够小,那么多个查询将不会有什么影响

即使查询的
where
子句由于索引而有效工作的位置相当大,您也可以

您可以合并查询-如果
WHERE
子句相同,则可以将它们放在一起

依我看,代码越容易阅读,就越容易维护。如果您没有获得显著的性能提升,那么整合就毫无意义

查询的效率是根据它所消耗的资源量来衡量的,而不是它的整合程度或看起来有多复杂。您最好查看执行计划,找出表中所需的任何结构更改或索引

最吸引我注意的是,您尝试了
光标
,现在已将其更改为
WHILE
循环

您会发现基于集合的操作比游标更有利于数据库工作

根据运营评论进行编辑


由于该表预计会很快填满,因此应该进行负载测试。用大量的测试数据(比如说一年的数据)加载该表,并查看查询的执行情况。

一般注意,您可以在
SET
子句中使用
CASE
语句。。。但这是否会简化查询取决于尚未指定的详细信息。但是,我用{some condition}表示的那些区域通常会查找具有多个子查询的同一个表(过滤数据),并将其与外部查询EXISTS-…-匹配,其中outerQueryTable.Id=innersumaryquerytable.Id,因此,我不确定这是否是一个好的做法。您好,不幸的是,一旦该表上线,它将很快充满数据。合并查询似乎也不是一个选项,因为条件彼此相差很大。请您更清楚地说明“您会发现基于集合的操作比游标更有利于数据库工作。”。你是说用一段时间代替光标是个坏主意?感谢更清楚的说明,我并没有用WHILE循环逐行检查整个表。我只是得到一个FK ID的不同值,并用该ID更新一批行。简单地说,更新X,其中ID=@whileVariable。简言之,假设表有1百万行,我的while将最多循环10次,而不是1百万次。
UPDATE TEST_TABLE SET STATE = 1
WHERE {some condition}

UPDATE TEST_TABLE SET STATE = 2
WHERE {some condition}

UPDATE TEST_TABLE SET STATE = 3, SOME_OTHER_COLUMN={value}
WHERE {some condition}

WHILE(some condition)

BEGIN
UPDATE TEST_TABLE SET STATE = 4, SOME_OTHER_COLUMN={value}

WHERE {some condition}

END