sql-server - 我可以使用 Hadoop 加速慢速 SQL 存储过程吗?

标签 sql-server performance hadoop bigdata

问题:

我有来自 2 个不同应用程序的 2 个 SQL Server 数据库。他们描述了工业机器的不同方面:一个是关于“每个订单花费了多少消耗品”,另一个是关于“每个运算符(operator)生产了多少好/坏的产品”。有时很多运算符(operator)一个接一个地在处理一个订单,有时一个运算符(operator)在处理多个小订单,数据库中没有连接Order-Operator。

我想要一个统一的事实表,其中每个 timestamp我知道MachineID , OrderIDOperatorID .如果一个 timestamp存在于 DB1 中,则该记录将具有来自它的数字度量(消耗品);如果它存在于 DB2 中,那么它将具有来自 DB2 的数字度量(好/坏的生产项目)。如果它存在于两个数据库中,则它具有所有数字度量。一个简单的UNION ALL还不够,因为我想拥有MachineID , OrderIDOperatorID对于每条记录。

我创建了一个 T-SQL 存储过程来制作 FULL JOIN通过时间戳和 MachineID。但是在大型数据集(多台机器,多个客户)上,它变得非常慢。这两个应用程序都支持编辑历史记录,因此我需要在每晚加载时合并两个数据库的完整历史记录。

为了加快进程,我想将计算放入多个并行线程中,由 Customer 分隔, MachineID , 和 Year .

我尝试使用 SQL Server 存储过程来做到这一点,由具有不同参数的 SQL 代理并行运行,但我发现它对性能没有帮助。相反,它在更新登台表和最终表时创建了多个死锁。

我正在寻找解决此问题的替代方法,但是 我不知道什么是正确的工具 . Hadoop 或类似的并行处理工具可以帮助完成这项任务吗?

我正在寻找成本最低的解决方案,因为它仅用于一项特定任务。对于其他一切,SQL Server 和 PowerBI 报告对我来说都很好。

最佳答案

鉴于范围有限,Hadoop 在这个用例中似乎很难证明是合理的。 Hadoop 的优点在于,当数据分布在多个服务器/存储介质上时,它不仅由于并行处理而且由于并行 IO 具有良好的扩展性。除非您乐于将所有数据复制到分布在多个节点上的 HDFS,否则它可能不会有太大帮助。如果你想启动一个 Hadoop 集群并运行多个查询单个 SQL 服务器的作业,那么以后的结果可能会很糟糕。

您是否考虑过允许您限制每晚处理的数据量的优化?

例如。什么是“时间戳”字段?是否反射(reflect)上次更新时间?您可以使用它来过滤自上次运行以来尚未更新的行吗?

即使“时间戳”不是上次更新的时间,您是否可以添加一个“updateTime”字段并触发将填充该字段的更新,因此您不需要导入自上次运行以来未更改的行?如果你在字段上建立索引,那么,如果一天中的更新次数相对于总表大小来说并不高,那么在该字段上使用过滤器的查询将命中索引,并且获取增量更改应该很快。

另一件要考虑的事情 - 那些数据库是否在同一个节点/SQL 服务器上运行?访问远程数据库很慢,所以如果是这种情况,请先考虑如何解决这个问题。

关于sql-server - 我可以使用 Hadoop 加速慢速 SQL 存储过程吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47457056/

相关文章:

sql-server - SQL Server - 排序规则 - Latin1_General_CI_AS 和 Latin1_General_CS_AS 之间的区别

c# - 用户控件连接到 SqlServer 数据库

hadoop - 从本地文件系统上载文件到HDFS时出错

hadoop - HDFS上非结构化数据行的数据存储格式

sql-server - 带有 WHERE 子句的 LEFT OUTER JOIN

sql-server - 需要有关 NULL 值的 PIVOT 帮助

list - 如何有效地从索引开始获取 Tcl 列表的其余部分?

java - URI 与文件性能

performance - 在保持元素/样式/脚本关系的同时缩小整个目录?

hadoop - 在Hive中注册Hbase表