我需要为一个项目维护一个统计表,由项目列表及其使用情况组成(想想像一个网站,你想在其中计算浏览量)。每次实例化一个项目时,我都需要增加特定项目的使用量。
我的第一个实现是:
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)你能建议一个最好的方法来实现结果吗?我希望在写入更新时有负载,而读取会更频繁。是否存在增加值的特定函数?我在看“序列”,但我不确定这是否是正确的方法......
非常感谢您的任何建议
最近我确实以超级用户的身份创建了一个表,其中包括一个序列号列,例如,
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)
有人可以帮我理解
针对此数据库的全文查询(存储 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
在我的应用程序中,我尽可能地进行多行插入,因为它减少了数据库和应用程序之间的往返次数。
不过,我很好奇,还有其他好处吗?例如,如果像这样一次插入多行:
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 在哪里存储它需要为我提供服务的数据(这里:http : //www.postgresql.org/docs/8.4/static/storage-file-layout.html)
正如它所写的那样,PostgreSQL 的数据和存储似乎在我存储PGDATA文件夹的相应文件系统之上工作。在这个文件夹中,数据再次存储在一组单独的文件中(即每个数据库的文件)。
问题: 虽然我可以接受这样的“文件系统内设置”,
我想知道是否可以将 PostgreSQL 设置为直接在 POSIX 系统上使用块设备(如 /dev/sda)进行数据存储?
我认为这会提供一些优势:
如果不是 PostgreSQL,是否有已知的数据库应用程序不依赖于将其数据保存为文件文件系统,而是直接使用块设备?
我有一个包含大约 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 中有一个旧的和不推荐使用的命令,它早于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 语法来做到这一点。
我在这里问了一个问题: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) 我正在尝试在我的 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) 我有两个表叫做record和record_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 ×10
index ×2
performance ×2
concurrency ×1
copy ×1
ctas ×1
cte ×1
optimization ×1
permissions ×1
pg-hba.conf ×1
pivot ×1
sequence ×1
sql-standard ×1
syntax ×1