相关疑难解决方法(0)

大表的高效分页

使用PostgreSQL 10.5。我正在尝试创建一个分页系统,用户可以在其中来回切换各种结果。

为了不使用OFFSET,我id在名为p(prevId)的参数中从上一页的最后一行传递了。然后我选择id高于p参数中传递的数字的前三行。(如本文所述

例如,如果id上一页的最后一行是 5,我会选择前 3 行的 anid大于 5:

SELECT 
  id, 
  firstname, 
  lastname 
FROM 
  people 
WHERE 
  firstname = 'John'
  AND id > 5 
ORDER BY 
  ID ASC 
LIMIT 
  3;
Run Code Online (Sandbox Code Playgroud)

这很好用,而且时机也不错:

Limit  (cost=0.00..3.37 rows=3 width=17) (actual time=0.046..0.117 rows=3 loops=1)
   ->  Seq Scan on people  (cost=0.00..4494.15 rows=4000 width=17) (actual time=0.044..0.114 rows=3 loops=1)
         Filter: ((id > 5) AND (firstname = 'John'::text))
         Rows Removed by Filter: …
Run Code Online (Sandbox Code Playgroud)

postgresql performance index paging postgresql-10 query-performance

10
推荐指数
1
解决办法
1万
查看次数

文本列比较等于 where 子句但不选择匹配行

我们在查询生产数据库中的表时遇到问题。一个文本列将与我们在 where 子句中过滤的字符串相等,但 postgres 不会选择该行。(我们在 postgres 11.11 上)我们的表设置如下:

(PROD)=> \d names;
                           Table "public.names"
        Column        |            Type             | Collation | Nullable | Default
----------------------+-----------------------------+-----------+----------+---------
 name                 | text                        |           | not null |
 processed_name       | text                        |           | not null |
 name_index           | integer                     |           | not null |
 when_created         | timestamp without time zone |           | not null |
Indexes:
    "names_pkey" PRIMARY KEY, btree (name, processed_name)
    "names_name_index_key" UNIQUE CONSTRAINT, btree (name_index)
    "ix_names_name" btree (name)
    "ix_names_processed_name" btree (processed_name)
Run Code Online (Sandbox Code Playgroud)

当我们处理名称列表时,我们会检查它们是否已经在表中,以防止重复添加和违反主键约束。

然而,在一个名字上,'?????? ????????? ???????',查看名称是否已经存在的查询返回一个空集, …

postgresql string

6
推荐指数
1
解决办法
67
查看次数

如何在并发插入数据上使用 UUID v4 和创建时间进行分页?

语境:

出于好奇,我正在为我的应用程序进行负载测试。然后结果发生了很多并发插入。

在创建端点上进行负载测试后,我尝试在 Fetch 端点上进行负载测试,包括测试分页。对于分页,我组合了两列:id(带有 UUID v4 的 PK)和created_time。另外,我还添加了索引以加快排序速度。我从这里遵循这些解决方案。

问题:

由于数据是同时插入的,因此有几行具有相同的created_time,在我的例子中,同一时间戳最多有100(行)。

这是我的表架构,一个示例

BEGIN;

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

DROP TABLE IF EXISTS "payment_with_uuid";

CREATE TABLE "payment_with_uuid" (
 id VARCHAR(255) PRIMARY KEY NOT NULL DEFAULT (uuid_generate_v4()),
 amount integer NULL,
 name varchar(255) default NULL,
 created_time TIMESTAMPTZ NOT NULL DEFAULT (now() AT TIME ZONE 'utc')
);

CREATE INDEX idx_payment_pagination ON payment_with_uuid (created_time, id);

COMMIT;
Run Code Online (Sandbox Code Playgroud)

这是我的查询,

SELECT  * from payment_with_uuid ORDER BY  created_time DESC, id DESC LIMIT 10;
Run Code Online (Sandbox Code Playgroud)

它将返回 10 行付款,假设数据如下所示,并假设时间戳在第 …

postgresql pagination

4
推荐指数
1
解决办法
6234
查看次数