标签: postgresql

PostgreSQL 附加范围分区很慢

我有一个范围分区表,我希望能够快速交换同一范围内的分区(即重新创建表并为其交换现有分区表)。但是,即使分区具有所有必需的索引,附加分区也需要很长时间。

-- create a partitioned table
create table "partitioned" (
  "k1" INTEGER NOT NULL,
  "k2" INTEGER NOT NULL,
  PRIMARY KEY("k1", "k2")
) PARTITION BY RANGE "k1";

-- create the table to be added as a partition
create table "segment_1_000_000_to_2_000_000" (
  "k1" INTEGER NOT NULL,
  "k2" INTEGER NOT NULL,
  PRIMARY KEY("k1", "k2")
);

-- insert 300,000,000 rows into table "segment_1_000_000_to_2_000_000" with "k1" values between values 1,000,000 and 2,000,000
-- ...

-- takes 5 minutes:
alter table "partitioned" attach partition "segment_1_000_000_to_2_000_000 for …
Run Code Online (Sandbox Code Playgroud)

postgresql index partitioning

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

隐藏所有现有查询中的行

我有一个 Postgres 14 数据库,想要实现以下场景:

is_hidden我最近在表中添加了一列foo。我的应用程序中有几个查询(大约 15 个读取操作)foo直接或间接(通过联接)使用该表。

我需要从所有查询中排除带有is_hiddenas 的所有行。true我应该如何实现这个目标?

两种解决方案:

  • 显然,一一更新所有相关查询并添加一个WHERE NOT is_hidden子句。寻找不易出错、较短且易于恢复的解决方案。

  • 根本没有该is_hidden列,并将该行完全移到单独的表中hidden_foo。但由于商业原因,目前这是不可能的。

postgresql select

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

使用 ALTER SYSTEM 从命令行设置 PostgreSQL 配置

我需要编写一个 shell/bash 脚本来自动更改一些 PostgreSQL 配置。

这是我写的命令:

sudo -u postgres psql -U postgres -d postgres -c "
ALTER SYSTEM SET listen_addresses = '127.0.0.1';
ALTER SYSTEM SET max_connections = '200';
ALTER SYSTEM SET shared_buffers = '24GB';
ALTER SYSTEM SET work_mem = '128MB';
...
"
Run Code Online (Sandbox Code Playgroud)

但是我收到这个错误:

ERROR:  ALTER SYSTEM cannot run inside a transaction block
Run Code Online (Sandbox Code Playgroud)

我该怎么做才能解决这个错误?

postgresql psql postgresql-14

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

PostgreSQL 相当于 Oracle 的 ANY_VALUE(...) KEEP (DENSE_RANK FIRST/LAST ORDER BY ...)

Oracle SQL 中有一项技术可用于简化聚合查询:

聚合特定列,但使用 SELECT 列表中的简单计算列从不同列获取信息。

--Oracle
--For a given country, what city has the highest population? (where the country has more than one city)
--Include the city name as a column.
select
    country,
    count(*),
    max(population),
    any_value(city) keep (dense_rank first order by population desc)   --<<--
from
    cities
group by
    country
having
    count(*) > 1
Run Code Online (Sandbox Code Playgroud)

数据库<>小提琴

如上所示,以下列可以带入城市名称,即使城市名称不在 GROUP BY 中:

 any_value(city) keep (dense_rank first order by population desc)
Run Code Online (Sandbox Code Playgroud)

有多种方法可以使用 SQL 来实现此类操作。我正在 PostgreSQL 中寻找一种解决方案,让我可以在计算列中完成此操作 - 所有这些都在单个 SELECT 查询中(没有子查询、联接、WITH 等)。

问题:PostgreSQL 中是否有与 Oracle …

postgresql oracle aggregate group-by greatest-n-per-group

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

静态大型 PostgreSQL 表的查询性能

我试图尽可能详细地说明这一点。抱歉长度!

背景

protein_snp_assoc我在 PostgreSQL(版本 12.13)数据库上创建了以下分区表:

CREATE TABLE protein_snp_assoc (
  protein_id    int not null,
  snp_id        int not null,
  beta          double precision,
  se            double precision,
  logp          double precision
) PARTITION BY RANGE (snp_id);
Run Code Online (Sandbox Code Playgroud)

然后,我根据以下模板创建了 51 个分区,每个分区包含大约 1.5 亿行(总共 76.5 亿行):

CREATE TABLE IF NOT EXISTS protein_snp_assoc_(x) PARTITION OF protein_snp_assoc
  FOR VALUES FROM (y) TO (z);
Run Code Online (Sandbox Code Playgroud)

其中x范围从 1 到 51,并y, z定义间隔,每个长度为 150,000。例如,前两个和最后一个分区是:

protein_snp_assoc_1 FOR VALUES FROM (1) TO (150001),
protein_snp_assoc_2 FOR VALUES FROM (150001) TO (300001), ...
protein_snp_assoc_51 …
Run Code Online (Sandbox Code Playgroud)

postgresql database-design read-only-database query-performance postgresql-performance

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

PostgreSQL 中的操作顺序是什么?

我是一名数据库学生,我执行了以下查询来同时学习一些内容(LEFT/RIGHT JOIN、UNION、WHERE + RegEx)。令我困扰的是执行顺序。我有两个表,如下所示:

create table practicaleft(
    id smallint primary key,
    nombre varchar,
    cumple date
);

create table practicaright(
    id smallint primary key,
    apellido varchar,
    cumpleanios date
);
Run Code Online (Sandbox Code Playgroud)

然后,我插入一些随机数据:

INSERT INTO practicaleft VALUES
(1, 'John', CURRENT_DATE - 1),
(5, 'Alice', CURRENT_DATE - 5),
(3, 'Bob', CURRENT_DATE - 3),
(7, 'Eva', CURRENT_DATE - 7);

INSERT INTO practicaright VALUES
(5, 'Doe', CURRENT_DATE - 5),
(6, 'Smith', CURRENT_DATE - 6),
(3, 'Johnson', CURRENT_DATE - 3),
(4, 'Brown', CURRENT_DATE - 4);
Run Code Online (Sandbox Code Playgroud)

之后,我执行此查询:

select id, …
Run Code Online (Sandbox Code Playgroud)

postgresql query execution-plan

4
推荐指数
2
解决办法
2256
查看次数

Postgres 将字符串“now”奇怪地转换为时间戳

看起来 postgres 将字符串'now()'视为对函数的调用now()

为什么 postgres 允许这样做?

select 'now'::timestamp;
Run Code Online (Sandbox Code Playgroud)

或这个?

select 'now()'::timestamp;
Run Code Online (Sandbox Code Playgroud)

甚至这个?

select '  (  (  ))) now)('::timestamp;
Run Code Online (Sandbox Code Playgroud)

它不会对其他函数(例如clock_timestamp().

数据库小提琴

postgresql datatypes timestamp cast

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

在 PostgreSQL 10 中创建新数据库时如何防止要求输入密码?

我使用以下批处理文件在 PostgreSQL 10 中创建一个新数据库。

echo off
cd "C:\Program Files (x86)\PostgreSQL\10\bin"
createdb -h localhost -p 5432 -U postgres myDB
Run Code Online (Sandbox Code Playgroud)

但它要求输入密码。如何防止要求输入密码?我尝试使用此链接中-w解释的选项不要求输入密码提示。但这不起作用。如何防止要求密码?

postgresql windows command-line ddl postgresql-10

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

POSTGRES 在函数中声明包含日期数组的变量

我正在尝试声明一个日期数组。

我试过这个:

DECLARE
dateVal DATE[] := ['2018-01-01','2018-02-01'];
Run Code Online (Sandbox Code Playgroud)

我得到:

ERROR:  syntax error at or near "["
Run Code Online (Sandbox Code Playgroud)

我如何正确声明它?

postgresql plpgsql array

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

使用 PostgreSQL 函数而不是加入?

我对如何做某事没有疑问,但我是否应该这样做。抱歉,如果有更合适的论坛。

我有一个功能:

CREATE OR REPLACE FUNCTION get_name(user_id UUID) RETURNS TEXT AS $$
    SELECT username
    FROM   users
    WHERE  users.id=user_id
$$ LANGUAGE 'sql';
Run Code Online (Sandbox Code Playgroud)

我喜欢使用这个函数在其他查询中从 user_id 转换为用户名。这是一个常见的操作,我认为一个函数会加快开发时间,以查找一次性统计数据以进行数据分析。我不关心查询速度。这是使用函数来执行此操作的好习惯还是我应该只执行连接?

我对此很陌生,我的同事说将函数用于常规选择/连接可以执行的操作是不好的做法。他还提到,函数最好用于常规选择无法完成的事情。所以我想问其他人什么是好的做法?

编辑:如果这是一种不好的做法,那么对于函数执行稍微复杂一些的常见操作的情况是否更合理?

postgresql best-practices functions

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