我一直在开发一个用作预定作业的查询。为了简化,我要对表进行一些特定的计算,并根据计算结果更新几列(如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功能的子查询。所以原始代码看起来比这更混乱。提前致谢。 --Ozan
答案 0 :(得分:1)
如果表格足够小,则多个查询不会受到影响。
即使查询的WHERE
子句因索引而有效工作的地方相当大,也可能没问题。
您可以合并查询 - 如果WHERE
条款相同,那么您可以将它们组合在一起。
IMO,代码读取越容易,维护起来就越容易。如果你没有获得重大的性能提升,那么合并真的没有意义。
查询的效率是根据它消耗的资源量来衡量的,而不是它的整合程度如何或看起来有多复杂。您可能最好还是查看执行计划并找出表中所需的任何结构变化或索引。
引起我注意的最重要的事情是您尝试了CURSOR
,现在已将其更改为WHILE
循环。
您会发现基于集合的操作比游标更有利于数据库工作。
基于OP评论的编辑
由于表格预计会很快填满,所以你应该进行负载测试。用大量的测试数据(比如一年的价值)加载表格,看看你的查询是如何运作的。