3

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

一个样本(就像目前的样子)可以展示如下:


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

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

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

假设所有查询都包含在事务和 try-catch 块中。

最后,这是我的问题:由于这将是一个计划在晚上执行的工作,所以性能对我来说不是首要任务。但是,我无法弄清楚如何使用更清洁、更高效(性能方面)的查询来进行相同的操作。我需要一些建议。请注意,{some condition} 区域包含具有 EXISTS 功能的子查询。所以原始代码看起来比这要混乱得多。提前致谢。——奥赞

4

1 回答 1

1

如果表足够小,那么多个查询不会受到伤害。

即使WHERE查询的子句由于索引而有效地工作的地方相当大,您也可能没问题。

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

IMO,代码越容易阅读,就越容易维护。如果你没有获得重大的性能提升,那么整合真的没有意义。

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

引起我注意的最重要的事情是您尝试了 aCURSOR并且现在已将其更改为WHILE循环。

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

根据 OP 评论进行编辑

由于该表预计会很快填满,因此您应该进行负载测试。用大量测试数据(假设是一年)加载表,然后查看查询的执行情况。

于 2011-11-17T21:52:52.957 回答