我有一系列遵循一般模式的更新语句:一次更新聚合来自另一个表(或有时是多个表)的值,下一次更新根据聚合值生成排名。对于总共 46 个更新语句,此过程重复 23 次。每个更新对独立运行需要 30-40 秒,但是当我通过 PgAdmin 将它们作为单个事务一起运行时,它需要一个多小时,而不是我期望的基于单个查询时间的约 15 分钟。(上次尝试时,我最终停止执行并单独运行它们。)
如果我通过 psql 在文件中运行相同的更新集,则该过程将在预期的 15 分钟时间内完成。
查询计划器是否有一些怪癖会根据在单个事务中运行的大量更新语句来更改执行计划?鉴于 psql 和 PgAdmin 之间的不同行为,我认为这与查询打包执行的方式有关,但我不太熟悉,无法了解其中的区别。
有没有办法编写我的代码,以便在通过 PgAdmin 作为单个事务运行时提高性能?
我在 Ubuntu 16.04 上使用 PostgreSQL 9.5。
以下是代码中的两个示例对联:
-- bike_driver_aggressive
UPDATE generated.crash_aggregates
SET bike_driver_aggressive = (
SELECT COUNT(*)
FROM crashes_bike2 c
WHERE c.int_id = crash_aggregates.int_id
AND c.aggressive_driverfault
);
WITH ranks AS (
SELECT int_id,
rank() OVER (ORDER BY bike_driver_aggressive DESC) AS rank
FROM crash_aggregates
)
UPDATE generated.crash_aggregates
SET bike_driver_aggressive_rank = ranks.rank
FROM ranks
WHERE crash_aggregates.int_id = ranks.int_id; …Run Code Online (Sandbox Code Playgroud) 我想要 PostgreSQL 数据库中表中的一列(我使用的是 9.6 版)。我知道UTF8_UNICODE_CIMySQL上的排序规则,所以我尝试了:
CREATE TABLE thing (
id BIGINT PRIMARY KEY
,name VARCHAR(120) NOT NULL COLLATE "UTF8_UNICODE_CI"
);
Run Code Online (Sandbox Code Playgroud)
但我得到:
Run Code Online (Sandbox Code Playgroud)ERROR: collation "UTF8_UNICODE_CI" for encoding "UTF8" does not exist
环顾四周,我发现pg_collation表格显示了排序规则,其中显示:
=# SELECT * from pg_collation;
collname | collnamespace | collowner | collencoding | collcollate | collctype
----------+---------------+-----------+--------------+-------------+-----------
default | 11 | 10 | -1 | |
C | 11 | 10 | -1 | C | C
POSIX | 11 | 10 | -1 | …Run Code Online (Sandbox Code Playgroud) postgresql collation pattern-matching encoding case-sensitive
我有一个很大的制表符分隔文件,我想将其读入 PostgreSQL 9.5 中的表。 它包含双引号和反斜杠,我想将它们视为常规字符。
我认为 COPY FROM 是要走的路,但我不知道如何禁用转义。
以下是数据示例(来自Google 的 ngram 数据集):
aX13_X 2006 8 5
aX13_X 2007 4 3
aX13_X 2008 2 1
a\ 1852 1 1
a\ 1935 1 1
a\ 1937 2 2
ACT1V1T1ES 2003 15 11
ACT1V1T1ES 2004 63 6
ACT1V1T1ES 2005 1 1
ACT1V1T1ES 2006 5 4
ACT1V1T1ES 2008 4 3
ACTION=" 1995 3 3
ACTION=" 1996 6 5
ACTION=" 1997 9 7
ACTION=" 1998 19 11
ACTION=" 1999 11 5
Run Code Online (Sandbox Code Playgroud)
和表: …
这似乎是一个很常见的场景:几种类型都构成相同的子类型。
这通常看起来像这样:
-- 'name' is unique per parent record
CREATE TABLE sometype (
sometype_id serial PRIMARY KEY,
name text
);
CREATE TABLE foo (foo_id serial PK);
CREATE TABLE bar (bar_id serial PK);
CREATE TABLE foo_sometype (
foo_id int4,
sometype_id int4
);
CREATE TABLE bar_sometype (
bar_id int4,
sometype_id int4
);
Run Code Online (Sandbox Code Playgroud)
这很好,但查询起来很麻烦。我认为这可能更清洁:
-- 'name' is unique per parent record
CREATE TABLE sometype (
name text
);
CREATE TABLE foo_sometype (
foo_id int4
) INHERITS(sometype);
CREATE TABLE bar_sometype (
bar_id int4,
) …Run Code Online (Sandbox Code Playgroud) 我正在寻找在 PSQL 中执行多个命令的解决方案。
假设我有一个数据库名称为2 的文件。
1. slave1
2. slave2
Run Code Online (Sandbox Code Playgroud)
我已经有一个名为“ master_db”的主模板。
如果我手动完成,我将执行以下操作:
CREATE DATABASE slave1 TEMPLATE master_db;
CREATE DATABASE slave2 TEMPLATE master_db;
Run Code Online (Sandbox Code Playgroud)
如果只有 2 个,那会很容易,但在我的情况下有 30 个以上,因此我想知道我们是否可以创建一个脚本。我确实尝试过搜索,但找不到解决方案。
如果这很重要,数据库在同一个集群中。
我这里有一些设计问题。我有自己的用 Python 编写的 ListServ 实现,它与 Postfix+Dovecot 系统一起工作以处理邮件,以及一个 PostgreSQL 数据库后端,用于确定以下大部分功能:
lists下图中的表格)members图中的表格)listserv_membership下图中的表格,通过列表服务 ID 和成员 ID 将个人“成员”链接到他们所属的个人“列表”)
listserv_stats表)目前,数据库的结构是这样的(注意,我已经把我不打算关注的表中所有不相关的字段都去掉了,并保留了主键;相关表用三个标记旁边的白色星号,此图是使用 DataGrip 创建的):
请不要因为图中的对角线箭头而大喊大叫——这个是作为一个快速而肮脏的图表完成的,而我在 Visio 中手工完成了一个很好的ERD,不幸的是我现在使用的计算机上没有
我要问的具体表是listserv_stats这里的表,而不是数据库设计的其余部分。
现在,最初,我只担心每天跟踪统计数据,以及基于列表服务活动天数的“所有时间”非常粗略的每日平均值。我现在更关心其他统计数据,例如月平均值、本月至今平均值、年初至今平均值和年度平均值,因此我正在考虑重新设计以更好地适应此类搜索。
当前的表CREATE语句是这样的:
CREATE TABLE listserv_stats
(
lsid INTEGER NOT NULL,
datestamp DATE DEFAULT now() NOT NULL,
msg_count INTEGER NOT NULL,
CONSTRAINT listserv_stats_lsid_date_pk PRIMARY KEY (lsid, datestamp),
CONSTRAINT listserv_stats_lists_lsid_fk FOREIGN KEY (lsid) REFERENCES …Run Code Online (Sandbox Code Playgroud) 我有一个包含 10,301,390 个 GPS 记录、城市、国家和 IP 地址块的表。我有用户当前的经纬度位置。我创建了这个查询:
SELECT
*, point(45.1013021, 46.3021011) <@> point(latitude, longitude) :: point AS distance
FROM
locs
WHERE
(
point(45.1013021, 46.3021011) <@> point(latitude, longitude)
) < 10 -- radius
ORDER BY
distance LIMIT 1;
Run Code Online (Sandbox Code Playgroud)
这个查询成功地给了我我想要的东西,但它很慢。根据给定的纬度和经度,获得一条记录需要 2 到 3 秒。
我在latitude和longitude列上尝试了 B 树索引,也尝试过,GIST( point(latitude, longitude));但查询仍然很慢。
我怎样才能加快这个查询?
似乎缓慢是由 引起的,ORDER BY但我想获得最短距离,所以问题仍然存在。
假设我有一个这样的函数:
create function house_analysis(ingeo geometry)
returns table(count_all numeric, count_important numeric) as
$$
select count(*), count(*) filter (where h.import_flag)
from house_table h where st_intersects(ingeo, h.geom)
$$ language sql stable;
Run Code Online (Sandbox Code Playgroud)
我定义了一个这样的视图:
create or replace view postzone_analysis as (
select p.zipcode, ha.count_all, ha.count_important
from postzone_table p, house_analysis(p.geom) ha
);
Run Code Online (Sandbox Code Playgroud)
问题是:
如何pg_catalog.*使用我的视图(postzone_analysis或其视图)查询系统目录 ( ) 以oid获取其中使用的函数的列表?他们的pg_proc.oid价值观很好。
我知道数据库会跟踪,因为我无法删除该函数,但在pg_depend.
数据库是 PostgreSQL 9.5。
(现实生活中的情况要复杂得多 - 它被缩小为最低可行的例子。视图调用就像 6 个分析函数,它结合了来自不同来源的数据,并且有多个基于不同区域类的视图。 )
我在 PostgreSQL、Employee 和 Leave 中有两个表,如下所示:
CREATE TEMP TABLE employee_table AS SELECT
id::int,
name::text
FROM ( VALUES
(1, 'John' ),
(2, 'David')
) AS t(id, name);
CREATE TEMP TABLE leave_table AS SELECT
id::int,
leave_date::date,
emp_id::int
FROM ( VALUES
(1, '01/10/1993' ,1),
(2, Null ,1),
(3, Null ,1),
(4, '02/12/1990' ,2),
(5, Null ,2),
(6, Null ,2)
) AS t(ID,Leave_Date,Emp_ID);
Run Code Online (Sandbox Code Playgroud)
我想更新 Leave 表并将 Leave_Date 列设置为每个员工的随机日期,可能是 01/01/2000,但如果员工在 Leave 表中有多个空条目,我想用两个不同的日期更新他的空条目这意味着一名员工在休假表中不应有两个相同的 Leave_Date 值,更新后我的休假表应如下所示:
ID Leave_Date Emp_ID
1 01/10/1993 1
2 01/01/2000 1
3 01/01/2001 1 …Run Code Online (Sandbox Code Playgroud) 我在 Ubuntu 14.04 上使用 Postgres 9.5。我在 /etc/postgresql/9.5/main/postgresql.conf 文件中设置了这些设置
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log' # log file name pattern,
# can include strftime() escapes
#log_file_mode = 0600 # creation mode for log files,
# begin with 0 to use octal notation
log_truncate_on_rotation = on # If on, an existing log file with the
# same name as the new log file will be
# truncated rather than appended to.
# But such truncation only occurs on
# time-driven rotation, not on restarts
# …Run Code Online (Sandbox Code Playgroud) postgresql ×10
collation ×1
csv ×1
dependencies ×1
disk-space ×1
encoding ×1
files ×1
functions ×1
gist-index ×1
index ×1
inheritance ×1
log ×1
pgadmin ×1
psql ×1
spatial ×1
subtypes ×1
update ×1
view ×1