标签: postgresql

为什么我的查询一起运行比单独运行时花费的时间更长?

我有一系列遵循一般模式的更新语句:一次更新聚合来自另一个表(或有时是多个表)的值,下一次更新根据聚合值生成排名。对于总共 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 pgadmin execution-plan postgresql-9.5

5
推荐指数
1
解决办法
349
查看次数

相当于 PostgreSQL 中的 UTF8_UNICODE_CI 排序规则

我想要 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)

但我得到:

ERROR: collation "UTF8_UNICODE_CI" for encoding "UTF8" does not exist
Run Code Online (Sandbox Code Playgroud)

环顾四周,我发现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

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

在 PostgreSQL 中使用 COPY FROM 时如何禁用转义?

我有一个很大的制表符分隔文件,我想将其读入 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)

和表: …

postgresql csv postgresql-9.5

5
推荐指数
2
解决办法
9665
查看次数

使用表继承代替映射表

这似乎是一个很常见的场景:几种类型都构成相同的子类型。

这通常看起来像这样:

-- '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)

postgresql database-design inheritance subtypes

5
推荐指数
2
解决办法
6200
查看次数

在PSQL中执行一系列命令

我正在寻找在 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 个以上,因此我想知道我们是否可以创建一个脚本。我确实尝试过搜索,但找不到解决方案。

如果这很重要,数据库在同一个集群中。

postgresql psql postgresql-9.5

5
推荐指数
1
解决办法
3508
查看次数

ListServ 数据库:统计表设计问题

我这里有一些设计问题。我有自己的用 Python 编写的 ListServ 实现,它与 Postfix+Dovecot 系统一起工作以处理邮件,以及一个 PostgreSQL 数据库后端,用于确定以下大部分功能:

  • listserv 上存在哪些列表(lists下图中的表格)
  • 谁曾在 listserv 上被视为任何列表的成员。(下members图中的表格)
  • 谁是列表的当前成员,以及:(listserv_membership下图中的表格,通过列表服务 ID 和成员 ID 将个人“成员”链接到他们所属的个人“列表”)
    • 他们可以发送到列表吗?(表格中的隐藏字段)
    • 他们可以接收发送到列表的消息吗?(表格中的隐藏字段)
  • ListServ 统计 - 根据当前日期的时间戳,对于每个有活动的单独列表,每天的消息计数。(下listserv_stats表)

目前,数据库的结构是这样的(注意,我已经把我不打算关注的表中所有不相关的字段都去掉了,并保留了主键;相关表用三个标记旁边的白色星号,此图是使用 DataGrip 创建的):

当前的ERD 请不要因为图中的对角线箭头而大喊大叫——这个是作为一个快速而肮脏的图表完成的,而我在 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)

postgresql database-design

5
推荐指数
1
解决办法
59
查看次数

如何加快对地理位置过程的查询

我有一个包含 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 秒。

我在latitudelongitude列上尝试了 B 树索引,也尝试过,GIST( point(latitude, longitude));但查询仍然很慢。

我怎样才能加快这个查询?

更新:

似乎缓慢是由 引起的,ORDER BY但我想获得最短距离,所以问题仍然存在。

postgresql index spatial gist-index

5
推荐指数
1
解决办法
5761
查看次数

获取视图中使用的函数列表

假设我有一个这样的函数:

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 view functions dependencies

5
推荐指数
1
解决办法
1336
查看次数

更新具有不同随机日期的 PostgreSQL 表

我在 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)

postgresql update

5
推荐指数
1
解决办法
4533
查看次数

为什么 Postgres 不遵守“log_filename”规定的我的日志文件名约定?

我在 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 configuration disk-space log files

5
推荐指数
1
解决办法
1155
查看次数