如何在更新过程中最小化数据库争用的可能性

迈克尔·莫雷

我已经编写了一些PostgreSQL数据库客户端代码,以使用来自多个客户端的IP地址和主机名表更新中央数据库。有两个表:一个用于保存IP地址和主机名之间的映射,另一个用于保存尚未解析为主机名的IP地址队列。

这是IP地址到主机名的映射表:

CREATE TABLE g_hostmap(
    appliance_id     INTEGER,
    ip               INET,
    fqdn             TEXT,
    resolve_time     TIMESTAMP, 
    expire_time      TIMESTAMP,
    UNIQUE(appliance_id, ip))

这是工作队列表:

CREATE TABLE g_hostmap_work(
    ip               INET,
    input_table      TEXT)

每个数据库客户端都从单个工作队列表中提取请求。每个请求都包含一个为其请求主机名的专用IPv4地址。

工作流程如下:每个客户端定期在中央数据库工作队列中查询需要主机名的IP地址列表,对这些地址执行反向DNS查找,然后使用( IP地址,主机名),一次一对。我希望通过尝试同时解析相同的IP地址来减少多个客户端重复工作的可能性。

我将每批更新限制为最大10行或行中工作队列大小的10%。客户的时间安排有些独立。在更新过程中,如何进一步减少对DNS名称服务器和主机名表的争用?我的客户担心会有很多重复的工作。

这是工作队列中项目数量的初始查询:

SELECT COUNT(*)
       FROM g_hostmap_work queued
       LEFT JOIN g_hostmap cached
            ON queued.ip = cached.ip
            AND now() < cached.expire_time

这是返回工作队列中项目子集的查询:

SELECT queued.ip, queued.input_table, cached.expire_time
       FROM g_hostmap_work queued
       LEFT JOIN g_hostmap cached
            ON queued.ip = cached.ip
            AND now() < cached.expire_time
       LIMIT 10

这是单个INSERT语句的示例,该语句使用新的IP地址/主机名映射来更新数据库:

INSERT INTO g_hostmap_20131230 VALUES
(NULL, '192.168.54.133', 'powwow.site', now(), now() + 900 * INTERVAL '1 SECOND')
斯科特·马洛

我会提出一种奇怪的建议。在源表中添加一个auto-inc big int,并使用模除法创建一组10个索引。这是一个简单的测试用例示例:

create table queue (id bigserial, input text);
create index q0 on queue (id) where id%10=0;
create index q1 on queue (id) where id%10=1;
create index q2 on queue (id) where id%10=2;
create index q3 on queue (id) where id%10=3;
create index q4 on queue (id) where id%10=4;
create index q5 on queue (id) where id%10=5;
create index q6 on queue (id) where id%10=6;
create index q7 on queue (id) where id%10=7;
create index q8 on queue (id) where id%10=8;
create index q9 on queue (id) where id%10=9;
insert into queue select generate_series(1,50000),'this';

我们在这里所做的是创建一组索引,该索引对表的1/10进行索引。接下来,我们将选择其中一个范围的一部分进行处理:

begin;
select * from queue where id%10=0 limit 100 for update;
id  | input 
------+-------
10 | this
20 | this
30 | this
-- do work here --
commit;

现在有趣的部分。如果使用此设置有> 10个工作程序,则只需在数字之间循环,超过10个的工作程序将在上述选择运行更新时等待。但是任何其他数字(1到9)仍然有效。

begin;
select * from queue where id%10=1 limit 100 for update;
 id  | input 
-----+-------
   1 | this
  11 | this
  21 | this
  31 | this
-- do work here
commit;

这样,所有工作被分成10个桶。想要更多的水桶?更改%后的数字并增加要匹配的索引数。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在更新过程中迁移SharedPreferences?

来自分类Dev

确保Rails数据库在更新时记录唯一性而不会中止更新过程

来自分类Dev

电子:如何最小化渲染过程中的窗口

来自分类Dev

使用任务或线程从大数据表(进度数据库)逐行更新datagrid,但在更新过程中保持UI响应

来自分类Dev

负对数可能性最小化的参数约束

来自分类Dev

如何在所选数据库的所有过程中为公用参数更新数据类型

来自分类Dev

实体框架:如何在向数据库添加或更新数据的过程中包括嵌套子级

来自分类Dev

数据库查询的可能性?

来自分类Dev

如何在SQL Server中的更新过程中正确使用XML参数

来自分类Dev

如何在更新过程中将空值设置为QueryDSL时间戳列?

来自分类Dev

如何在SQL Server中的更新过程中正确使用XML参数

来自分类Dev

如何在Eclipse IDE中最小化Javascript文件?

来自分类Dev

如何在Inno Setup中最小化安装程序?

来自分类Dev

如何在张量流中最小化池?

来自分类Dev

Java 数据库最小化连接创建

来自分类Dev

如何通过几个“多对多”关系否定或最小化重复的数据库记录(行)

来自分类Dev

SQL Server:如何在存储过程中使用数据库名称作为参数?

来自分类Dev

如何在跨多个数据库的存储过程中查找文本

来自分类Dev

如何在跨多个数据库的存储过程中查找文本

来自分类Dev

SQL Server:如何在存储过程中使用数据库名称作为参数?

来自分类Dev

最小化/最大化clojure / core.logic中的可能性?

来自分类Dev

多设备混合应用程序:如何在发行和发行构建过程中进行组合,最小化和混淆?

来自分类Dev

在更新过程中,可扩散数据源部分标题闪烁

来自分类Dev

如何在if语句中最小化测试表达式的数量?

来自分类Dev

如何在Ubuntu的系统托盘中最小化Evolution?

来自分类Dev

如何在Android中最小化和最大化页面?

来自分类Dev

javascript-如何在JavaScript中最小化if else语句与文件类型?

来自分类Dev

如何在 Xcode 9.1 中最小化 iOS 模拟器窗口?

来自分类Dev

如何在 Mathematica 中最小化具有约束的函数

Related 相关文章

  1. 1

    如何在更新过程中迁移SharedPreferences?

  2. 2

    确保Rails数据库在更新时记录唯一性而不会中止更新过程

  3. 3

    电子:如何最小化渲染过程中的窗口

  4. 4

    使用任务或线程从大数据表(进度数据库)逐行更新datagrid,但在更新过程中保持UI响应

  5. 5

    负对数可能性最小化的参数约束

  6. 6

    如何在所选数据库的所有过程中为公用参数更新数据类型

  7. 7

    实体框架:如何在向数据库添加或更新数据的过程中包括嵌套子级

  8. 8

    数据库查询的可能性?

  9. 9

    如何在SQL Server中的更新过程中正确使用XML参数

  10. 10

    如何在更新过程中将空值设置为QueryDSL时间戳列?

  11. 11

    如何在SQL Server中的更新过程中正确使用XML参数

  12. 12

    如何在Eclipse IDE中最小化Javascript文件?

  13. 13

    如何在Inno Setup中最小化安装程序?

  14. 14

    如何在张量流中最小化池?

  15. 15

    Java 数据库最小化连接创建

  16. 16

    如何通过几个“多对多”关系否定或最小化重复的数据库记录(行)

  17. 17

    SQL Server:如何在存储过程中使用数据库名称作为参数?

  18. 18

    如何在跨多个数据库的存储过程中查找文本

  19. 19

    如何在跨多个数据库的存储过程中查找文本

  20. 20

    SQL Server:如何在存储过程中使用数据库名称作为参数?

  21. 21

    最小化/最大化clojure / core.logic中的可能性?

  22. 22

    多设备混合应用程序:如何在发行和发行构建过程中进行组合,最小化和混淆?

  23. 23

    在更新过程中,可扩散数据源部分标题闪烁

  24. 24

    如何在if语句中最小化测试表达式的数量?

  25. 25

    如何在Ubuntu的系统托盘中最小化Evolution?

  26. 26

    如何在Android中最小化和最大化页面?

  27. 27

    javascript-如何在JavaScript中最小化if else语句与文件类型?

  28. 28

    如何在 Xcode 9.1 中最小化 iOS 模拟器窗口?

  29. 29

    如何在 Mathematica 中最小化具有约束的函数

热门标签

归档