查看CTE或临时表?

时间:2018-07-17 06:12:53

标签: sql sql-server performance

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

因此,从总体上看,在性能方面仅占一点优势?

ctetemp tableview吗?

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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

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

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

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

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

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

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