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