Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 节点postgres simple SELECT变得非常慢(PostgreSQL)_Node.js_Postgresql_Postgresql Performance_Node Postgres - Fatal编程技术网

Node.js 节点postgres simple SELECT变得非常慢(PostgreSQL)

Node.js 节点postgres simple SELECT变得非常慢(PostgreSQL),node.js,postgresql,postgresql-performance,node-postgres,Node.js,Postgresql,Postgresql Performance,Node Postgres,我正在为postgresql支持的手机游戏开发一个服务器端应用程序,我正在将pg与Knex一起使用(“pg”:“6.1.2”和“Knex”:“0.12.6”)。不久前,我遇到了选择性能下降的问题。最新的Postgresql和v4.7.2节点 我已经用40个虚构的ccu对我的应用程序进行了基准测试。所以我测量了Query构造函数和Query.prototype.handleReadyForQuery之间的时间,以及我得到的: {“从\“玩家战斗\”中选择计数(*),其中(\“攻击玩家\”=$1或\

我正在为postgresql支持的手机游戏开发一个服务器端应用程序,我正在将pg与Knex一起使用(“pg”:“6.1.2”和“Knex”:“0.12.6”)。不久前,我遇到了选择性能下降的问题。最新的Postgresql和v4.7.2节点

我已经用40个虚构的ccu对我的应用程序进行了基准测试。所以我测量了
Query
构造函数和
Query.prototype.handleReadyForQuery
之间的时间,以及我得到的:

{“从\“玩家战斗\”中选择计数(*),其中(\“攻击玩家\”=$1或\“防御玩家\”=$2)和攻击玩家防御玩家:[27, 74, 92, 156, 170, 203, 217, 230, 243, 251, 261, 269, 288, 303, 313, 328, 342, 352, 361, 384, 395, 407, 420, 428, 440, 448, 460, 471, 483, 494, 507, 515, 537, 538, 539, 30, 40, 60, 1564, 2273, 2287, 2291, 2320, 2327, 2346, 2354, 2370, 2380, 2388, 2402, 2411, 2419, 2429, 2436, 2444, 4014, 4412, 4421, 4421, 4422, 4423, 4423, 4424, 4425, 4426, 4427, 4427, 4428, 4429, 4429, 18, 35, 60, 78, 113, 125, 151, 161, 170, 178, 185, 197, 611, 1972, 1987, 1988, 1988, 1989, 1991, 1992, 1993, 1993, 1994, 1995, 1996, 1996, 1997, 1997, 1999, 1999, 2000, 2001, 2002, 2002, 2002]}
(数字数组表示完成特定查询的时间ms)

4429毫秒,卡尔!令人不快的惊喜

显然,问题在于未优化的sql或错误的索引,但使用pgBadger分析日志表明:

有什么想法吗

相关问题@Github:

上一个问题:

UPD这里是“一般活动”的屏幕截图:

UPD2

示例查询
选择计数(*)
来自“玩家之战”
其中(“进攻球员”=$1
或“防守球员”=2美元)
进攻队员防守队员
(其中$1和$2是
1
2

目标表ddl
创建表public.player\u
(
id integer NOT NULL默认值nextval('player\U BATTERS\U id\U seq'::regclass),
攻击\u玩家整数不为空,
不允许整数为空,
_\u-won布尔值是否不为空,
接收到的\u荣誉整数不为空,
丢失的\u荣誉整数不为空,
偷来的金子,
在bigint处创建的_不为NULL默认值“0”::bigint,
攻击\u级别\u atm整数非空默认值0,
防御\u级别\u atm整数非空默认值0,
攻击\u荣誉\u atm整数非空默认值0,
维护\u荣誉\u atm整数非空默认值0,
no_winner boolean NOT NULL默认值false,
自动击败布尔运算,
约束玩家\u战斗\u pkey主键(id),
约束玩家\u战斗\u攻击玩家\u外键(攻击玩家)
参考public.player_配置文件(id)匹配简单
更新时不执行任何操作
在删除“无操作”时,
约束玩家\u战斗\u防御玩家\u外键(防御玩家)
参考public.player_配置文件(id)匹配简单
更新时不执行任何操作
不删除任何操作
)
与(
OID=错误
)
表空间pg_默认值;
和索引
创建索引玩家\u战斗\u攻击\u玩家\u索引
关于使用btree的public.player_战斗
(进攻队员)
表空间pg_默认值;
创建索引玩家\u战斗\u创建\u索引
关于使用btree的public.player_战斗
(在描述处创建)
表空间pg_默认值;
创建索引玩家\u战斗\u防御\u玩家\u索引
关于使用btree的public.player_战斗
(防守队员)
表空间pg_默认值;
解释分析
Aggregate(成本=19.40..19.41行=1宽度=8)(实际时间=0.053..0.053行=1圈=1)
->播放器上的位图堆扫描(成本=8.33..19.39行=4宽度=0)(实际时间=0.030..0.047行=4循环=1)
重新检查条件:((进攻队员=1)或(防守队员=2))
过滤器:(进攻队员防守队员)
堆块:精确=4
->BitmapOr(成本=8.33..8.33行=4宽度=0)(实际时间=0.021..0.021行=0循环=1)
->在玩家索引上进行位图索引扫描(成本=0.00..4.16行=2宽度=0)(实际时间=0.016..0.016行=2圈=1)
索引条件:(进攻球员=1)
->在玩家索引上进行位图索引扫描(成本=0.00..4.16行=2宽度=0)(实际时间=0.003..0.003行=2圈=1)
索引条件:(防守球员=2)
计划时间:0.907毫秒
执行时间:0.160毫秒
额外数据 在
player\u-battles
中大约有160名玩家和310行,但行数与问题无关。系统:DigitalOcean 2cpu/2gb ram。
pgBadger
的输出和
节点postgres
的响应时间:


我的conf文件可能会有帮助:

完成postgresql性能标签上的[链接]中的步骤,并将信息粘贴到您的问题中。@Andrew Medvedev,如果这是knex的问题,而不是您的查询/数据库的问题,那么总是可以通过knex直接执行查询,或者直接执行;)您必须显示
解释(ANALYZE,BUFFERS)
如果您希望人们帮助您优化查询,请输出查询。添加了额外的信息。多亏了@Mike和Laurenz,因为查询规划需要很长时间,所以这些查询应该作为准备好的语句执行;)无论如何,如果计划执行需要几秒钟的时间,那么这似乎是您的数据库问题[链接postgresql性能标签,并将信息粘贴到您的问题中。@Andrew Medvedev,如果这是knex的问题,而不是您的查询/数据库的问题,那么总是可以通过knex直接执行查询,或者直接执行;)您必须显示
解释(分析,缓冲区)
如果您希望人们帮助您优化查询,请输出查询。添加了额外的信息。多亏了@Mike和Laurenz,因为查询规划需要很长的时间,所以这些查询应该作为准备好的语句执行;)无论如何,如果规划e需要几乎一秒钟的时间,这似乎是您的数据库问题
Aggregate  (cost=19.40..19.41 rows=1 width=8) (actual time=0.053..0.053 rows=1 loops=1)
  ->  Bitmap Heap Scan on player_battles  (cost=8.33..19.39 rows=4 width=0) (actual time=0.030..0.047 rows=4 loops=1)
        Recheck Cond: ((attacking_player = 1) OR (defending_player = 2))
        Filter: (attacking_player <> defending_player)
        Heap Blocks: exact=4
        ->  BitmapOr  (cost=8.33..8.33 rows=4 width=0) (actual time=0.021..0.021 rows=0 loops=1)
              ->  Bitmap Index Scan on player_battles_attacking_player_index  (cost=0.00..4.16 rows=2 width=0) (actual time=0.016..0.016 rows=2 loops=1)
                    Index Cond: (attacking_player = 1)
              ->  Bitmap Index Scan on player_battles_defending_player_index  (cost=0.00..4.16 rows=2 width=0) (actual time=0.003..0.003 rows=2 loops=1)
                    Index Cond: (defending_player = 2)
Planning time: 0.907 ms
Execution time: 0.160 ms