我有一个范围分区表,我希望能够快速交换同一范围内的分区(即重新创建表并为其交换现有分区表)。但是,即使分区具有所有必需的索引,附加分区也需要很长时间。
-- 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) 我有一个 Postgres 14 数据库,想要实现以下场景:
is_hidden我最近在表中添加了一列foo。我的应用程序中有几个查询(大约 15 个读取操作)foo直接或间接(通过联接)使用该表。
我需要从所有查询中排除带有is_hiddenas 的所有行。true我应该如何实现这个目标?
两种解决方案:
显然,一一更新所有相关查询并添加一个WHERE NOT is_hidden子句。寻找不易出错、较短且易于恢复的解决方案。
根本没有该is_hidden列,并将该行完全移到单独的表中hidden_foo。但由于商业原因,目前这是不可能的。
我需要编写一个 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)
我该怎么做才能解决这个错误?
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 …
我试图尽可能详细地说明这一点。抱歉长度!
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
我是一名数据库学生,我执行了以下查询来同时学习一些内容(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) 看起来 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 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解释的选项不要求输入密码提示。但这不起作用。如何防止要求密码?
我正在尝试声明一个日期数组。
我试过这个:
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)
我如何正确声明它?
我对如何做某事没有疑问,但我是否应该这样做。抱歉,如果有更合适的论坛。
我有一个功能:
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 转换为用户名。这是一个常见的操作,我认为一个函数会加快开发时间,以查找一次性统计数据以进行数据分析。我不关心查询速度。这是使用函数来执行此操作的好习惯还是我应该只执行连接?
我对此很陌生,我的同事说将函数用于常规选择/连接可以执行的操作是不好的做法。他还提到,函数最好用于常规选择无法完成的事情。所以我想问其他人什么是好的做法?
编辑:如果这是一种不好的做法,那么对于函数执行稍微复杂一些的常见操作的情况是否更合理?