向应用程序添加显式数据库事务会严重损害性能吗?
Could adding explicit database transactions to an app massively hurt performance?
我有一个旧应用程序 运行ning 在 SQL 服务器上(但我怀疑我要问的概念适用于 most/all 主要数据库)被重写了。除了许多 UI 更改和更多模块化后端代码导致不同查询这一事实之外,主要更改之一是旧代码使用零显式事务。
是的,如果发生错误,您将留下孤立记录等。新应用已更正该问题,在有多个 inserts/updates 时使用交易。这似乎很容易,但我们发现我们收到了很多关于性能的投诉,特别是来自拥有更多数据的客户(每个客户都有自己独立的数据库)。我是否正确地假设,鉴于交易,资源等待锁的空间更大,这可能会严重损害性能?
顺便说一句,另一个主要区别是旧应用程序在一定程度上依赖于存储过程,而新应用程序根本不使用它们。我把它扔在这里以防万一,但我真的觉得交易更有可能成为问题,特别是考虑到系统中查询的复杂性(大量的查询有很多连接,子查询在SELECT 子句等)
此外,值得注意的是,我们并不是在谈论大 databases/tables。每个客户都有自己的数据库,客户抱怨有几百万条记录的表更糟,但没有 billions/trillions 条记录或类似的东西。虽然引入了一些新查询并更改了一些查询,但大多数查询与旧系统中的查询相同,有时只是 运行 在存储过程之外而不是在存储过程内部。此外,已经检查了很多更复杂的查询,当 运行 单独查询时,它们很快。
我们通过设置一系列 jobs/procs 打包为 dbWarden 来解决这个问题。这使我们能够确定在某些情况下发生了很多阻塞。一旦我们弄清楚了,我们就进行了调整以避免阻塞,包括对不同的数据库进行某些操作read/write,调整索引,以及使一些操作查询不同的数据存储(ElasticSearch)。
我有一个旧应用程序 运行ning 在 SQL 服务器上(但我怀疑我要问的概念适用于 most/all 主要数据库)被重写了。除了许多 UI 更改和更多模块化后端代码导致不同查询这一事实之外,主要更改之一是旧代码使用零显式事务。
是的,如果发生错误,您将留下孤立记录等。新应用已更正该问题,在有多个 inserts/updates 时使用交易。这似乎很容易,但我们发现我们收到了很多关于性能的投诉,特别是来自拥有更多数据的客户(每个客户都有自己独立的数据库)。我是否正确地假设,鉴于交易,资源等待锁的空间更大,这可能会严重损害性能?
顺便说一句,另一个主要区别是旧应用程序在一定程度上依赖于存储过程,而新应用程序根本不使用它们。我把它扔在这里以防万一,但我真的觉得交易更有可能成为问题,特别是考虑到系统中查询的复杂性(大量的查询有很多连接,子查询在SELECT 子句等)
此外,值得注意的是,我们并不是在谈论大 databases/tables。每个客户都有自己的数据库,客户抱怨有几百万条记录的表更糟,但没有 billions/trillions 条记录或类似的东西。虽然引入了一些新查询并更改了一些查询,但大多数查询与旧系统中的查询相同,有时只是 运行 在存储过程之外而不是在存储过程内部。此外,已经检查了很多更复杂的查询,当 运行 单独查询时,它们很快。
我们通过设置一系列 jobs/procs 打包为 dbWarden 来解决这个问题。这使我们能够确定在某些情况下发生了很多阻塞。一旦我们弄清楚了,我们就进行了调整以避免阻塞,包括对不同的数据库进行某些操作read/write,调整索引,以及使一些操作查询不同的数据存储(ElasticSearch)。