使用 PK 违规作为检查是否存在的方式会降低数据库性能吗?
Does using PK violation as way of checking for existence reduce DB performance?
我正在使用 python 库将任务插入数据库,每秒执行几十个任务。每个任务都有一个唯一的标识符,如果任务已经存在于数据库中,则库会更新它。
库执行它的方式总是插入,从数据库中捕获 PK 违规错误并更新。
使用这种不断违反PK的方法而不是先选择查看任务是否已经存在或使用ON CONFLICT是否有成本?是否每次都会在数据库中调用一些错误处理,从而导致性能下降?这是一个外部库,我想知道我是否应该自己实现逻辑。我使用的特定数据库是 postgres,如果它有所作为的话。
将检查是否存在作为独立于插入的步骤绝对不是正确的方法。从性能角度(两次往返数据库)和数据一致性角度(两个线程都可能同时尝试插入相同的值)来看,这很糟糕。
捕获主键错误仍然需要两次往返数据库,这会产生额外的开销。当然,数据库正在处理数据完整性,因此您没有竞争条件——除非您也是 deleting/modifying 主键。
最好的解决方案是让数据库处理数据完整性。即使用ON CONFLICT DO UPDATE
.
是否要更改工作库是另一回事。有时,经过测试的、可靠的、次等的解决方案比完美的解决方案更容易保留。
我正在使用 python 库将任务插入数据库,每秒执行几十个任务。每个任务都有一个唯一的标识符,如果任务已经存在于数据库中,则库会更新它。
库执行它的方式总是插入,从数据库中捕获 PK 违规错误并更新。
使用这种不断违反PK的方法而不是先选择查看任务是否已经存在或使用ON CONFLICT是否有成本?是否每次都会在数据库中调用一些错误处理,从而导致性能下降?这是一个外部库,我想知道我是否应该自己实现逻辑。我使用的特定数据库是 postgres,如果它有所作为的话。
将检查是否存在作为独立于插入的步骤绝对不是正确的方法。从性能角度(两次往返数据库)和数据一致性角度(两个线程都可能同时尝试插入相同的值)来看,这很糟糕。
捕获主键错误仍然需要两次往返数据库,这会产生额外的开销。当然,数据库正在处理数据完整性,因此您没有竞争条件——除非您也是 deleting/modifying 主键。
最好的解决方案是让数据库处理数据完整性。即使用ON CONFLICT DO UPDATE
.
是否要更改工作库是另一回事。有时,经过测试的、可靠的、次等的解决方案比完美的解决方案更容易保留。