标签: postgresql

PostgreSQL并发计数器增量

我需要为一个项目维护一个统计表,由项目列表及其使用情况组成(想想像一个网站,你想在其中计算浏览量)。每次实例化一个项目时,我都需要增加特定项目的使用量。

我的第一个实现是:

statistics(
  id      integer NOT NULL,
  name    character varying(255) NOT NULL,
  usage   integer NOT NULL DEFAULT 0,
);


UPDATE statistics 
  SET usage = usage + 1
WHERE name = '<name>';
Run Code Online (Sandbox Code Playgroud)

我担心的是性能和并发性。更新过程将由几十个(可能是 80-120 个)设备实例化,并且每秒可能发生几次,所以我的问题是:

1)这个方法会保持并发吗?(即,如果多个设备“同时”请求更新,每个请求都会被计算在内吗?)

2)你能建议一个最好的方法来实现结果吗?我希望在写入更新时有负载,而读取会更频繁。是否存在增加值的特定函数?我在看“序列”,但我不确定这是否是正确的方法......

非常感谢您的任何建议

postgresql performance concurrency

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

明确授予更新序列列序列的必要权限?

最近我确实以超级用户的身份创建了一个表,其中包括一个序列号列,例如,

create table my_table
(
    id serial primary key,
    data integer
);
Run Code Online (Sandbox Code Playgroud)

因为我希望我的非超级用户用户拥有对该表的写访问权限,所以我授予了它权限:

grant select, update, insert, delete on table my_table to writer;
Run Code Online (Sandbox Code Playgroud)

在这样做之后的随机时间点,该用户所做的插入开始失败,因为该用户没有修改my_table_id_seq与串行列关联的序列的权限。不幸的是,我无法在我当前的数据库上重现它。

我通过授予用户所需的权限来解决这个问题,如下所示:

grant all on table my_table_id_seq to writer;
Run Code Online (Sandbox Code Playgroud)

有人可以帮我理解

  • 为什么,在某些时候,以前足够的权限可能会开始失败?
  • 为具有串行列的表授予写权限的正确方法是什么?

postgresql permissions sequence

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

由于行估计非常不准确,全文搜索速度缓慢

针对此数据库的全文查询(存储 RT(请求跟踪器)票证)似乎需要很长时间才能执行。附件表(包含全文数据)大约为 15GB。

数据库模式如下,大约有 200 万行:

rt4=# \d+ 附件
                                                    表“public.attachments”
     专栏 | 类型 | 修饰符 | 存储 | 描述
-----------------+------------------------------------------+-- -------------------------------------------------- -------+----------+-------------
 身份证 | 整数 | not null default nextval('attachments_id_seq'::regclass) | 平原 |
 交易ID | 整数 | 不为空| 平原 |
 家长 | 整数 | 非空默认值 0 | 平原 |
 消息ID | 字符变化(160) | | 扩展 |
 主题 | 字符变化(255) | | 扩展 |
 文件名 | 字符变化(255) | | 扩展 |
 内容类型 | 字符变化(80) | | 扩展 |
 内容编码 …

postgresql performance full-text-search execution-plan postgresql-9.1 query-performance

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

多行插入与多个单行插入

在我的应用程序中,我尽可能地进行多行插入,因为它减少了数据库和应用程序之间的往返次数。

不过,我很好奇,还有其他好处吗?例如,如果像这样一次插入多行:

insert into tbl (c1, c2) values
(v1, v2)
(v3, v4)
Run Code Online (Sandbox Code Playgroud)

相对:

insert into tbl (c1, c2) values (v1, v2)
insert into tbl (c1, c2) values (v3, v4)
Run Code Online (Sandbox Code Playgroud)

并且表有索引,索引是在第一种情况下计算一次,在第二种情况下计算两次吗?还是每次插入总是一次?假设两个查询在同一个事务中。

我正在使用 PostgreSQL。

postgresql index optimization

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

有没有办法将 PostgreSQL 数据库直接存储在块设备(而不是文件系统)上?

我正在阅读 PostgreSQL 在哪里存储它需要为我提供服务的数据(这里:http : //www.postgresql.org/docs/8.4/static/storage-file-layout.html

正如它所写的那样,PostgreSQL 的数据和存储似乎在我存储PGDATA文件夹的相应文件系统之上工作。在这个文件夹中,数据再次存储在一组单独的文件中(即每个数据库的文件)。

问题: 虽然我可以接受这样的“文件系统内设置”,

我想知道是否可以将 PostgreSQL 设置为直接在 POSIX 系统上使用块设备(如 /dev/sda)进行数据存储?

我认为这会提供一些优势:

  • 使数据库适合文件系统的块大小配置和优化不再需要考虑
  • 可以避免文件系统中的开销
  • 备份可以更简单

如果不是 PostgreSQL,是否有已知的数据库应用程序不依赖于将其数据保存为文件文件系统,而是直接使用块设备?

postgresql

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

Postgres 继承分区表的索引

我有一个包含大约 6000 万行的表,我按状态将其划分为 53 个子表。这些表像这样“继承”大表:

CREATE TABLE b2b_ak (LIKE b2b including indexes, CHECK ( state = 'AK') ) INHERITS (b2b8) TABLESPACE B2B;

我的问题是:如果在复制语句完成之前我不在 b2b8 上构建索引,子表是否继承索引?换句话说,我想这样做:

Create b2b8
Create b2b8_ak inherits b2b8
COPY b2b8 FROM bigcsvfile.csv
CREATE INDEX CONCURRENTLY
Run Code Online (Sandbox Code Playgroud)

并让整个事情结果在子表上创建了所有索引。

postgresql index copy

10
推荐指数
2
解决办法
8651
查看次数

使用 CREATE TABLE AS SELECT 如何指定 WITH 条件 (CTE)?

PostgreSQL 中有一个旧的和不推荐使用的命令,它早于CREATE TABLE AS SELECT(CTAS)称为SELECT ... INTO .... FROM,它支持WITH子句/公共表表达式(CTE)。所以,例如,我可以做到这一点..

WITH w AS (
  SELECT *
  FROM ( VALUES (1) ) AS t(x)
)
SELECT *
INTO foo
FROM w;
Run Code Online (Sandbox Code Playgroud)

但是,我不能这样做..

WITH w AS (
  SELECT *
  FROM ( VALUES (1) ) AS t(x)
)
CREATE TABLE foo AS
SELECT * FROM w;
Run Code Online (Sandbox Code Playgroud)

或者,我得到

ERROR:  syntax error at or near "CREATE"
LINE 5: CREATE TABLE foo AS
Run Code Online (Sandbox Code Playgroud)

我将如何使用标准化的 CTAS 语法来做到这一点。

postgresql syntax cte sql-standard ctas

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

自连接的替代方案

我在这里问了一个问题:https : //stackoverflow.com/questions/43807566/how-to-divide-two-values-from-the-same-column-but-at-different-rows

关于将同一表中同一列但不同行的值进行除法。现在我的问题是我有更多的分子和分母(不同的uns)。仍然是self join用 Postgres 解决这个问题的好方法还是有更好的解决方案?

例子:

| postcode | value | uns |
|----------|-------|-----|
|       AA |    40 |  53 |
|       BB |    20 |  53 |
|       AA |    10 |  54 |
|       AA |    20 |  55 |
|       AA |    10 |  56 |
|       AA |    30 |  57 |
|       AA |    50 |  58 |
|       BB |    10 |  54 |
|       BB | …
Run Code Online (Sandbox Code Playgroud)

postgresql pivot computed-column

10
推荐指数
2
解决办法
2121
查看次数

Postgres 似乎忽略了 listen_addresses 设置

我正在尝试在我的 Postgres 9.5.7 数据库(运行 Ubuntu 16.04)上禁用远程客户端访问。

我做了我认为正确的更改(见下文)但无济于事。我可以想到我的更改不起作用的两个原因:

  • 我正在编辑错误的文件
  • 我没有正确重启服务

我以为我排除了这些,但远程客户端仍然可以通话。那么我错过了什么?

实际上,我想要做的是恢复启用远程客户端访问的更改,以便我可以捕获这些更改并使用我们的盐堆栈重新应用它们。在我开始通过 salt 运行部署测试之前,我想知道远程访问被禁用,以便我可以确信我的 salt 堆栈正在进行更改。

一些数据

我正在使用我正在编辑的相同配置文件启动 postgres(ps重新格式化输出以提高可读性)

postgres@testweb:~$ ps -eaf | grep bin/post
postgres [snip] /usr/lib/postgresql/9.5/bin/postgres 
                -D /var/lib/postgresql/9.5/main 
                -c config_file=/etc/postgresql/9.5/main/postgresql.conf
Run Code Online (Sandbox Code Playgroud)

postgres 配置为仅侦听 localhost 端口(之前是 '*')

postgres@testweb:~$ grep listen_addresses /etc/postgresql/9.5/main/postgresql.conf
listen_addresses = 'localhost'      # what IP address(es) to listen on;
Run Code Online (Sandbox Code Playgroud)

基于主机的身份验证设置为 localhost。如果我禁用访问,这应该无关紧要,对吗?我的理解是,如果listen_addresses='localhost'那时远程客户端访问将不起作用。

postgres@testweb:~$ grep ^host /etc/postgresql/9.5/main/pg_hba.conf
host    all             all             127.0.0.1/32            md5
host    all             all             ::1/128                 md5
Run Code Online (Sandbox Code Playgroud)

我正在编辑正确的配置文件,但 listen_addresses 声称 *

postgres@testweb:~$ sql
psql (9.5.7)
Type "help" …
Run Code Online (Sandbox Code Playgroud)

postgresql configuration pg-hba.conf

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

没有重复行的左连接

我有两个表叫做recordrecord_history。对于每条记录,可能有多个历史记录。它们可以通过id和 连接record_id。我想record用最近的record_history数据获取所有的条目。我已经创建了这样的查询,

SELECT rec.id, rec.name, rech1.data AS last_history_data
FROM record rec
LEFT OUTER JOIN record_history rech1 ON (rec.id = rech1.record_id)
LEFT OUTER JOIN record_history rech2 ON (rec.id = rech2.record_id AND rech2.ts > rech1.ts)
WHERE rech2.id IS NULL
ORDER BY rec.id DESC
Run Code Online (Sandbox Code Playgroud)

在这里,我通过ts. 只要没有重复的ts条目,这就会起作用。如果最近的时间戳在 中重复record_history,则此查询将返回多于一行的记录。我们如何在左连接上应用限制来限制重复行?

postgresql greatest-n-per-group

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