想要实时?在数据库中运行脚本

在数据库内部运行脚本在性能、数据一致性和开发效率方面提供了引人注目的优势。

译自 Want Real Time? Run Scripts Inside the Database,作者 Matt Sarrel。

运行脚本的位置决定会显著影响系统性能、效率和整体架构。传统上,企业依赖于独立的应用程序服务器,但许多企业也选择直接在数据库内部执行脚本。这种方法可以简化数据操作并减少延迟。

通过利用数据库引擎本身的功能,这些脚本可以有效地执行复杂的、多步骤操作,而这些操作用单个查询很难完成。脚本可以由事务调用以确保数据一致性或应用业务规则。脚本可以包含循环和条件,这些循环和条件无法添加到 SQL 查询中。性能也可以得到提升,因为与外部应用程序不同,内部脚本不会产生网络开销;它们可以被编译,并且执行计划可以被缓存以获得更好的性能。

与传统方法的比较

传统上,许多应用程序将数据层(数据库)与应用程序逻辑层(应用程序服务器)分开——脚本在应用程序服务器上运行,然后与数据库通信以获取或操作数据。虽然这种架构有其优点,但它也引入了潜在的低效率,尤其是在处理大量数据或复杂操作时。

在数据库和应用程序服务器之间传输大量数据集可能是网络密集型且耗时的,而数据库和应用程序服务器之间的多次往返可能会成为瓶颈。

接近的力量:对性能和效率的影响

在数据库内部运行脚本的主要优势之一是它与数据本身的接近性,这转化为显著的性能优势和更高的效率。

示例:动态数据转换

让我们考虑一个需要动态查询、排序和转换数据的场景。我们将查询客户,按购买总额对客户记录进行排序,然后将每个客户分配到一个忠诚度等级。自然地,我们希望这尽可能快地发生。

无内部脚本:

  1. 应用程序服务器向数据库发送查询以检索原始数据。
  2. 数据库将结果集返回给应用程序服务器。
  3. 应用程序服务器处理数据(排序、转换等)。
  4. 如果需要更新,应用程序服务器会将更新查询发送回数据库。

这种方法涉及应用程序服务器和数据库之间的多次往返,可能会引入网络延迟并增加整体处理时间。

有内部脚本:

在这种情况下:

  1. 整个操作都在数据库内完成。
  2. 无需将数据传输到外部服务器。
  3. 可以利用数据库的内部优化来提高性能。

内部脚本方法的简单性、性能和操作便利性是显而易见的。所有操作都在一个地方发生,减少了复杂性和潜在的故障点。

详细的性能优势

如前所述,在数据库引擎内部运行脚本可以通过消除数据在数据库集群和应用程序服务器之间通过网络来回传输的需要,从而提供显著的性能优势。这减少了延迟并缓解了不可预测的延迟可能在分布式系统中造成的潜在问题。

内部脚本还可以利用数据库特定的功能和优化,这些功能和优化可能无法从外部访问。这包括对索引结构、统计信息和其他内部机制的低级访问,这些机制可以有效地利用 CPU、内存和 I/O 来显著提高性能。此外,现代数据库采用复杂的查询规划和优化技术。内部脚本自动受益于这些优化,从而提高性能,而无需开发人员手动调整或优化。

提高资源利用率

直接访问数据库引擎使它能够根据脚本完成的任务和当前系统负载来优化资源利用率。例如,数据库可以有效地管理大型数据集的内存分配,使用并行处理功能进行复杂计算,并优化 I/O 操作以进行数据检索和存储。

开发和维护效率

将脚本集中管理的方法简化了业务逻辑的维护和更新,因为更改可以在一个位置进行,而不是跨多个运行在独立服务器上的应用程序层进行。一个简单的 n 层架构可能为 UI/展示/Web 层、业务逻辑层、数据访问层和数据库设置独立的服务器。通过将数据处理逻辑整合到数据库中,组织可以简化整体系统架构,将需要管理和维护的组件数量减少到 UI 层和数据库层。更简单的系统架构可以简化故障排除和维护。

这种方法的主要优势之一是易于调试和故障排除。当脚本在数据库中运行时,调试通常可以直接在数据库环境中进行,简化了识别和修复问题的过程。这种集成的调试功能允许开发人员跟踪脚本执行,检查数据状态并更有效地解决问题,而不是在许多分布式系统中,问题可能跨越多个层或组件。

当脚本在数据库中运行时,开发过程本身变得更加简化——开发人员不再需要在多个环境和工具集之间推送数据。这种数据移动的减少最大限度地减少了同步问题和环境之间潜在的数据差异。

潜在的缺点和注意事项

在数据库引擎中运行脚本存在一些潜在的担忧,但这些担忧并非不可克服:

  • 脚本将如何影响整体数据库性能?如果脚本在数据库节点上消耗大量资源,它们可能会与常规数据库操作争夺 CPU、内存和 I/O。这种资源争用会导致其他数据库用户或应用程序的查询响应时间变慢,尤其是在使用高峰期。数据库管理员必须仔细监控和管理资源分配,以确保脚本执行不会对关键数据库功能产生负面影响。
  • 存储过程的语法特定于数据库,因此过度依赖存储过程会增加供应商锁定。使用 ANSI SQL 中的数据库调用编写“正常”代码更具可移植性。在编写脚本之前,请确保您的组织允许使用脚本。
  • 您的 DevOps 团队是否能够保持关注点分离,这是一种开发最佳实践?将逻辑整合到数据库中可以简化开发,但它也会模糊数据存储和业务逻辑之间的界限,可能会使系统的长期维护和演变变得复杂。

使用正确的数据库来缓解挑战

为了解决这些潜在的障碍,选择一个数据库系统至关重要,该系统专为高效的资源管理和可扩展性而设计。寻找提供以下功能的数据库:

  • 高级资源(CPU、内存、存储、网络)管理功能
  • 对分布式处理的内置支持
  • 具有良好开发工具的强大脚本语言
  • 对并发操作的有效处理

在数据库中运行脚本在性能、数据一致性和开发效率方面提供了引人注目的优势。通过将处理更靠近数据,组织可以实现更快的操作、更好的资源利用率和更简单的架构。在当今以微秒为单位的实时世界中,组织必须尽一切努力优化性能

采用这种方法的组织能够以更高的敏捷性、性能和资源效率来满足当今和未来的数据需求。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注