我可以使用 Hadoop 加速慢速 SQL 存储过程吗?
Posted
技术标签:
【中文标题】我可以使用 Hadoop 加速慢速 SQL 存储过程吗?【英文标题】:Can I use Hadoop to speed up a slow SQL stored procedure? 【发布时间】:2017-11-23 13:47:28 【问题描述】:问题:
我有来自 2 个不同应用程序的 2 个 SQL Server 数据库。他们描述了工业机器的不同方面:一个是关于“每个订单花费了多少消耗品”,另一个是关于“每个操作员生产了多少好/坏的产品”。有时很多操作员一个接一个地在处理一个订单,有时一个操作员在处理多个小订单,数据库中没有连接Order-Operator。
我想要一个统一的事实表,其中每个timestamp
我知道MachineID
、OrderID
和OperatorID
。如果 DB1 中存在timestamp
,则记录将包含来自它的数字度量(消耗品);如果它存在于 DB2 中,那么它将具有来自 DB2 的数字度量(好/坏的生产项目)。如果它存在于两个数据库中,则它具有所有数字度量。一个简单的UNION ALL
是不够的,因为我希望每条记录都有MachineID
、OrderID
和OperatorID
。
我创建了一个 T-SQL 存储过程,通过时间戳和 MachineID 创建FULL JOIN
。但是在大型数据集(多台机器,多个客户)上,它变得非常慢。这两个应用程序都支持编辑历史记录,因此我需要在每晚加载时合并两个数据库的完整历史记录。
为了加快处理速度,我想将计算放入多个并行线程中,由Customer
、MachineID
和Year
分隔。
我试图通过使用 SQL Server 存储过程来做到这一点,通过不同参数的 SQL 代理并行运行,但我发现它对性能没有帮助。相反,它在更新登台表和最终表时创建了多个死锁。
我正在寻找解决此问题的替代方法,但我不知道什么是正确的工具。 Hadoop 或类似的并行处理工具可以帮助完成这项任务吗?
我正在寻找成本最低的解决方案,因为只有一项特定任务需要它。对于其他一切,SQL Server 和 PowerBI 报告对我来说都很好。
【问题讨论】:
【参考方案1】:鉴于范围有限,Hadoop 在这个用例中似乎很难证明是合理的。 Hadoop 的优点在于,当数据分布在多个服务器/存储介质上时,它不仅由于并行处理而且由于并行 IO 具有良好的扩展性。除非您乐于将所有数据复制到分布在多个节点上的 HDFS,否则它可能不会有太大帮助。如果你想启动一个 Hadoop 集群并运行多个查询单个 SQL 服务器的作业,那么后面的结果可能会很糟糕。
您是否考虑过允许您限制每晚处理的数据量的优化?
例如什么是“时间戳”字段?是否反映上次更新时间?您可以使用它来过滤自上次运行以来尚未更新的行吗?
即使“时间戳”不是上次更新的时间,您是否可以添加一个“updateTime”字段并触发将填充该字段的更新,这样您就不需要导入自以前的运行?如果你在字段上建立索引,那么,如果一天中的更新次数相对于总表大小来说并不高,那么在该字段上使用过滤器的查询将命中索引,并且获取增量更改应该很快。
需要考虑的另一件事 - 那些数据库是否在同一节点/SQL 服务器上运行?访问远程数据库很慢,所以如果是这种情况,请先考虑如何解决此问题。
【讨论】:
以上是关于我可以使用 Hadoop 加速慢速 SQL 存储过程吗?的主要内容,如果未能解决你的问题,请参考以下文章