考虑 5 个表,每个表有超过 10 亿条记录。
查询需要加入它们。而且我知道他们只需要不到 10% 的记录。假设他们都有一个日期维度,并且只需要当前月份的数据。
什么应该更快:
1)使用简单的SELECT:连接所有表,然后过滤(WHERE)每个表的当前月份维度。
2)创建5个临时表,过滤每个源表的当前月份记录,这里我们也可以借此机会只选择需要的列,然后加入这些临时表。
额外的可能性:
3)维护二级表,只有当前月/年的数据。这些表由提供主要表的相同 ETL 维护。
考虑 5 个表,每个表有超过 10 亿条记录。
查询需要加入它们。而且我知道他们只需要不到 10% 的记录。假设他们都有一个日期维度,并且只需要当前月份的数据。
什么应该更快:
1)使用简单的SELECT:连接所有表,然后过滤(WHERE)每个表的当前月份维度。
2)创建5个临时表,过滤每个源表的当前月份记录,这里我们也可以借此机会只选择需要的列,然后加入这些临时表。
额外的可能性:
3)维护二级表,只有当前月/年的数据。这些表由提供主要表的相同 ETL 维护。
建立查询并查看。
查询优化器通常足够聪明,可以及早过滤。
SQL 是合乎逻辑的——在哪里并不意味着它会最后处理。
显然,您希望连接和过滤索引。
当您达到 5 个或更多连接时,优化器通常会变得防御性并进入循环连接。
我有引文吗?没有。这是一个观察。
当它达到 5 个或更多时,将条件拉入连接可以帮助优化器。
我有引文吗?没有。这是一个观察。
一次建立一个连接,看看它什么时候变得愚蠢。
一次优化一个连接。
如果您要实现,请在#temp 上放置一个pk。
从您认为会获得最大收益的地方开始。
where / join 中的 OR 条件是最麻烦的,通常会导致循环连接。
这些应该是第一个实现的。
您可以强制哈希连接,但这是一个可能会变坏的滑坡。
似乎有点奇怪,所有表都有日期维度,您通常会有一些查找类型表,其中包含更多静态类型数据。
如果您不需要表格的输出,那么 where exists可能会更好。