SQL中的临时表
我需要知道,将复杂查询分解为多个部分并创建临时表(在最后删除)是否是标准做法。?在OLAP应用程序中,这不应该是一个很大的问题,但在OLTP中,因为速度很重要,所以它是可以避免的?在OLTP处理过程中,我唯一使用临时表的时间是在处理一批需要分析/连接的数据时,并最终对其执行数据更改操作(插入/更新/删除)。我将使用临时表来提高a)速度,但更重要的是,b)因为正常的选择/更新或选择/删除逻辑太复杂,或者不能在一个事务语句中完成 例如,找到满足某些条件的10万用户,将其插入存档表中,然后将其删除SQL中的临时表,sql,Sql,我需要知道,将复杂查询分解为多个部分并创建临时表(在最后删除)是否是标准做法。?在OLAP应用程序中,这不应该是一个很大的问题,但在OLTP中,因为速度很重要,所以它是可以避免的?在OLTP处理过程中,我唯一使用临时表的时间是在处理一批需要分析/连接的数据时,并最终对其执行数据更改操作(插入/更新/删除)。我将使用临时表来提高a)速度,但更重要的是,b)因为正常的选择/更新或选择/删除逻辑太复杂,或者不能在一个事务语句中完成 例如,找到满足某些条件的10万用户,将其插入存档表中,然后将其删除 我
我不建议在大多数情况下对正常的select语句使用临时表。通过适当的索引、更好的sql连接/提示和/或更改数据结构以匹配数据访问路径,您几乎总能获得更好的性能。您问题中的关键词是“分解”。通常不鼓励使用临时表和其他策略,并发现它们会导致整体绩效降低。如果中间表有助于最快得到答案,那么优化器完全能够使用它们。您很少能够通过使用自己的策略强制优化器来帮助它 建议使用哪些索引也是一样的
当您看到这种情况时,几乎总是有人需要做更多的工作来优化查询语句。对于由DBMS优化的简单查询,临时表通常是一个坏主意,因为它们会引入开销 但是有时候,您的DBMS将很难优化复杂的查询。此时,您至少有5个选项:
当然,从理论上讲,您不应该在OLTP数据库上运行昂贵、复杂的查询,但在实践中,大多数应用程序从来都不是“纯”OLTP——在任何OLTP项目中都有一些复杂、难以优化的查询 在oltp系统中,如果处理是在线系统的一部分(即不是批处理),则我无法回忆起是否使用过临时表。使用某种过程逻辑通常是一种方法,例如Oracle中的PL/Sql等等 在OLAP中,临时表非常常见,通常将数据加载到一个表中,对其进行转换并将结果保存到另一个表中,并且根据处理的不同有许多转换步骤 我甚至想说,如果您有一个oltp系统,并且需要使用一个临时表,那么就会出现一些错误,修改您的设计,或者使用过程逻辑。在OLAP中,临时表非常常见
hth您是否将“复杂”查询分解,以使业务逻辑更易于应用,或更具可读性,而不是试图提高性能。。。或者反过来呢?我发现当CTE被实现时,我对临时表的需求几乎消失了。