繁体   English   中英

查看CTE或临时表?

[英]view over cte or temp table?

我在暂存层中有一个表(未编制索引),该表具有接近1亿行。 在数据仓库层中,我需要从该表中选择一定数量的行,然后与另一个表(约有5000万行)联接,现在我要使用cte。 从此CTE,在与其他表联接之前再次进行了一些汇总。 所以在这里,如果使用视图而不是cte会发生什么。 由于需要大量时间,因此我无法对其进行测试。

因此,从总体上讲,在性能方面哪一个略有优势?

ctetemp tableview

任何帮助表示赞赏。

我认为您应该使用带有索引的本地(单号)临时表。 因为首先您将从主表中获取数据。 然后,您将应用一些聚合,循环和自定义逻辑。 好处不多:-

  1. 首先,每当连接关闭时,本地临时表将被删除。
  2. 就像您说的那样,您将获得数百万条记录,然后使用索引将可以更快地搜索。
  3. 使用临时表并应用一些聚合不会给您的主表带来负担。

根据您的描述,CTE是“创建”一次(定义时),使用一次(聚合时)。

通常,这意味着您应将代码保留为单个查询,以使优化器找到最佳的执行路径。

通常,当多次引用CTE时,实现CTE将是一个更大的胜利。 通常,您可以使用窗口函数来避开多个引用,但这是另一回事。

这是一般性建议,但并非总是如此。 将CTE实例化为临时表可以带来两个好处:

  • 查询优化器可以更准确地估计要优化的行数。
  • 您可以添加索引以提高性能。

第一个可能不是问题,因为您仍然有很大一部分原始行。 第二个可能会有所帮助,但这并非难事。

您可能想要创建索引的物化视图,而不是临时表。 这将保持最新状态,并可能极大地提高性能。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM