SQL 服务器加入或 Pentaho Spoon 查找?
SQL Server join or Pentaho Spoon lookup?
什么提供更高的性能?
使用 T-SQL 编写查询,加入 tables,然后将结果插入另一个 table
使用 Pentaho Spoon 的 table 插入,然后使用数据库查找 "join" 每个 table,然后将结果插入另一个 table
objective是取一个非规范化的table,通过文本与5维table连接,获取维度的PK,然后将结果插入到事实 table.
可能更适合 dba.stackexchange.com。但我想数据库引擎会更快地执行此任务,因为 a) 它可以优化对使用索引和 table 统计信息涉及的所有 tables 的访问,以及 b) 你摆脱了开销ETL工具和多数据库查询介绍。 Pentaho PDI 单独处理行,因此对于来自您的 table 输入步骤的每一行,您将对每个查找步骤都有一个 SQL 查询。
传统观点认为 SQL 在复杂查询上优于 Pentaho PDI。真实性来自于盲目相信 SQL 优化器给出了真正的最优值。
我有许多反例,其中我们通过将 SQL 查询复杂性提取到一系列查找和过滤器中,将一个多小时的查询时间减少到几分钟。
我们更好,因为:
查找期望每个条目有一个匹配记录,而 SQL 优化器必须假设连接不是唯一的。就是像这里这样展开 star/snowflake 模式的情况。
查找步骤非常聪明,只读取需要的数据并将其保存在内存中,使用内部 sorted hashtables 进行配置以加快即将到来的查询。
当已知流已排序时,上述方法特别有效。虽然 select from oneTable order by
很快,尤其是当 table 被适当索引时,同样的 select from manyJoinedTables where LotsOfConditions order by
可能效率很低,因为 SQL 不能依赖索引。
事实上,我猜上述条件正是SQL优化器希望找到并依赖的条件,但由于一般性而不能。
根据经验,请相信 PDI 的效率。 Matt Casters 和 Jens Bleuel 制作了一款非常出色的软件,该软件在您无法想象的容量条件下进行了测试。
所以使用更容易维护的解决方案(大部分时间是 PDI 查找),如果它真的非常慢,那么将它移到 Input Table
s 但不要期望系统性更好.
备注:
避免Database Lookup
(准备语句使用缓存,但我们恰恰是每次查找不同键的情况)。
避免Joins
,即:明确告诉 kettle 它可以指望唯一匹配,如果你知道是这种情况的话。 Join Rows
和 Merge Join
是有效的步骤,但只有在对传入流进行排序时才有效。
尽快使用Filters
(减少行数)。甚至,每条规则都有它的例外,在SQL。
不用Select values
减少列数。对速度几乎没有影响!你不会觉得 Kettle 天真地一步一步地重写值,而不是使用一个聪明的指针系统,不是吗?。
JavaScript
的计算并没有传说中那么低效,实际上PDI通常更忙于排序和查找。
不要在许多 Memory Group by
步中传播聚合。这些步骤中的每一个都需要在知道它完成之前读取所有传入流,因此它是后续步骤的阻塞因素。
通常 Sorted Group by
不会改善 Memory Group by
。一个例外是当内存达到其配额并且 java 开始通过垃圾收集器启动垃圾收集器。在这种情况下,可以使用排序将数据存储在临时磁盘上。
避免中介tables。而是通过添加列来构建流程,当数据准备就绪时,将其放入具有较大提交大小的 Output Table
。
什么提供更高的性能?
使用 T-SQL 编写查询,加入 tables,然后将结果插入另一个 table
使用 Pentaho Spoon 的 table 插入,然后使用数据库查找 "join" 每个 table,然后将结果插入另一个 table
objective是取一个非规范化的table,通过文本与5维table连接,获取维度的PK,然后将结果插入到事实 table.
可能更适合 dba.stackexchange.com。但我想数据库引擎会更快地执行此任务,因为 a) 它可以优化对使用索引和 table 统计信息涉及的所有 tables 的访问,以及 b) 你摆脱了开销ETL工具和多数据库查询介绍。 Pentaho PDI 单独处理行,因此对于来自您的 table 输入步骤的每一行,您将对每个查找步骤都有一个 SQL 查询。
传统观点认为 SQL 在复杂查询上优于 Pentaho PDI。真实性来自于盲目相信 SQL 优化器给出了真正的最优值。
我有许多反例,其中我们通过将 SQL 查询复杂性提取到一系列查找和过滤器中,将一个多小时的查询时间减少到几分钟。
我们更好,因为:
查找期望每个条目有一个匹配记录,而 SQL 优化器必须假设连接不是唯一的。就是像这里这样展开 star/snowflake 模式的情况。
查找步骤非常聪明,只读取需要的数据并将其保存在内存中,使用内部 sorted hashtables 进行配置以加快即将到来的查询。
当已知流已排序时,上述方法特别有效。虽然
select from oneTable order by
很快,尤其是当 table 被适当索引时,同样的select from manyJoinedTables where LotsOfConditions order by
可能效率很低,因为 SQL 不能依赖索引。
事实上,我猜上述条件正是SQL优化器希望找到并依赖的条件,但由于一般性而不能。
根据经验,请相信 PDI 的效率。 Matt Casters 和 Jens Bleuel 制作了一款非常出色的软件,该软件在您无法想象的容量条件下进行了测试。
所以使用更容易维护的解决方案(大部分时间是 PDI 查找),如果它真的非常慢,那么将它移到 Input Table
s 但不要期望系统性更好.
备注:
避免
Database Lookup
(准备语句使用缓存,但我们恰恰是每次查找不同键的情况)。避免
Joins
,即:明确告诉 kettle 它可以指望唯一匹配,如果你知道是这种情况的话。Join Rows
和Merge Join
是有效的步骤,但只有在对传入流进行排序时才有效。尽快使用
Filters
(减少行数)。甚至,每条规则都有它的例外,在SQL。不用
Select values
减少列数。对速度几乎没有影响!你不会觉得 Kettle 天真地一步一步地重写值,而不是使用一个聪明的指针系统,不是吗?。JavaScript
的计算并没有传说中那么低效,实际上PDI通常更忙于排序和查找。不要在许多
Memory Group by
步中传播聚合。这些步骤中的每一个都需要在知道它完成之前读取所有传入流,因此它是后续步骤的阻塞因素。通常
Sorted Group by
不会改善Memory Group by
。一个例外是当内存达到其配额并且 java 开始通过垃圾收集器启动垃圾收集器。在这种情况下,可以使用排序将数据存储在临时磁盘上。避免中介tables。而是通过添加列来构建流程,当数据准备就绪时,将其放入具有较大提交大小的
Output Table
。