标签: postgresql

未首先执行 Postgres WITH

我正在 PostgreSQL 9.5 中处理从两个视图中提取的 SQL 查询。单独来看,这些视图需要 93 毫秒和 530 毫秒来执行,分别产生 ~1500 和 ~6200 行。鉴于处理进入视图,这似乎是合理的,其中包括与 PostGIS 的一些空间交叉点。但是,当我执行下面的查询时,大约需要 5 秒才能执行。

据我所知, usingWITH应该强制子查询在下面的查询中的评估之前执行一次,这应该导致总时间不到一秒而不是五秒。

如果我通过 ODBC/MS Access 链接到两个视图并使用 MS Access 在没有 的情况下执行查询WITH,它会在不到一秒的时间内执行。这让我认为,当我在 pgAdmin 中执行子查询时,在加入之前不会每次都执行一次。

视图中没有其他 CTE,只有子查询。

有没有更好的方法来做到这一点,或者强制执行顺序的黑客?

WITH 
  eu AS (
    SELECT
      e.sample_pk,
      .....
    FROM
      public.samples_exp_unit AS e
    ),
  sr AS (
    SELECT
      r.sample_pk,
      .....
    FROM
      public.sample_results AS r
    )

SELECT
  sr.sample_pk,
  eu.inventory_pk,
  .....
FROM sr INNER JOIN eu
ON sr.sample_pk = eu.sample_pk
Run Code Online (Sandbox Code Playgroud)

全查询的执行计划:

"Hash Join  (cost=963.49..1007.02 rows=9 width=120) (actual …
Run Code Online (Sandbox Code Playgroud)

postgresql cte postgresql-9.5

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

PostgreSQL - 多列 B 树索引如何处理第一列的 order by 和第二列的 IN 查找?

我创建了这样的表(类似于http://use-the-index-luke.com/sql/example-schema/postgresql/performance-testing-scalability 中的示例)

CREATE TABLE scale_data (
   section NUMERIC NOT NULL,
   id1     NUMERIC NOT NULL, -- unique values simulating ID or Timestamp
   id2     NUMERIC NOT NULL -- a kind of Type
);
Run Code Online (Sandbox Code Playgroud)

填充它:

INSERT INTO scale_data
SELECT sections.sections, sections.sections*10000 + gen.gen
     , CEIL(RANDOM()*100) 
  FROM GENERATE_SERIES(1, 300)     sections,
       GENERATE_SERIES(1, 90000) gen
 WHERE gen <= sections * 300;
Run Code Online (Sandbox Code Playgroud)

它生成了 13545000 条记录。

综合指数就可以了:

CREATE INDEX id1_id2_idx
  ON public.scale_data
  USING btree
  (id1, id2);
Run Code Online (Sandbox Code Playgroud)

并选择#1:

select id2 from scale_data 
where id2 in (50)
order …
Run Code Online (Sandbox Code Playgroud)

postgresql performance index postgresql-9.5 postgresql-performance

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

存储几何和地理或存储一个并计算另一个?

我刚刚开始设计我的第一个 GIS 数据库,使用 PostGIS / PostgreSQL,我有一个关于几何和地理的问题,特别是存储几何是否更有效(因为它支持更多功能)然后在我需要时投影到地理它,或者我是否应该同时存储几何和重新投影的地理?

更详细地说,数据库将填充包含英国国家网格 (EPSG:27700) (OSGR) 和转换后的 WGS84 (EPSG:4326) 值的预先存在的数据,并且该数据将定期更新来自外部资源。这将争论两列,因为我不需要进行计算。

展望未来,我希望允许使用 OSM 或文本输入作为 OSGR 或通过 GPS 坐标通过“指向并单击”基于 Web 的地图应用程序编辑数据。搜索设施也将允许 OSGR 或纬度/经度。有两列意味着我总是必须至少对输入执行一次计算(尽管不是搜索),而只有一列意味着我有时可能需要计算输入,再次可能需要计算搜索。

我想我已经说服自己在我的表中同时需要几何和地理列(可能还需要每个列的投影列,以便我可以在未来的某个时间处理爱尔兰),但这是否明智?

谢谢。

postgresql spatial postgis

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

pg_cron crontab 日志问题

我们正在尝试在 PostgreSQL 中配置定期作业。为此,我们在运行 Postgres 9.6 的 Linux 机器上安装了citusdata pg_cron项目。

系统信息:

按照pg_cron存储库中的说明,我们在postgresql.conf以下配置中进行设置:

shared_preload_libraries = 'pg_cron'   
cron.database_name = 'our db_name'
Run Code Online (Sandbox Code Playgroud)

然后,db_name我们创建了 EXTENSION pg_cron

CREATE EXTENSION pg_cron;
Run Code Online (Sandbox Code Playgroud)

我们安排了我们的第一个 Postgres 工作:

SELECT cron.schedule('45 12 * * *', $$CREATE TABLE testCron AS Select 'Test Cron' as Cron$$);
Run Code Online (Sandbox Code Playgroud)

因此,jobid 1 被创建并列在表中cron.job

我们预计在 12:45 将启动计划作业的命令。但什么也没有发生。

testCron表未创建,我们在任何日志中都没有踪迹。

我们还定义了 LOG_FILE/usr/src/pg_cron/include/pathnames.h …

postgresql scheduled-tasks cron

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

Postgres 全文搜索,带有重音和屈折(共轭等)

我希望能够在 Postgres 中以屈折(波兰)语言搜索无重音的短语。

比如说,如果一个文档包含robi?em,则词位应该是robi?(infinivite)。它的形式有robi?robi?robi?a等等。例如,我希望能够找到它,robie其中包含一个不带重音的短语robi?

我所做的是从一个运行良好的波兰语文本搜索配置开始

CREATE TEXT SEARCH DICTIONARY polish_ispell (
TEMPLATE = pg_catalog.ispell,
dictfile = 'polish', afffile = 'polish', stopwords = 'polish' );
Run Code Online (Sandbox Code Playgroud)

然后我尝试扩展它以包含unaccent.

create extension unaccent;
create text search configuration polish_unaccented (copy = polish);
ALTER TEXT SEARCH CONFIGURATION polish_unaccented   ALTER MAPPING FOR hword, 
hword_part, word WITH unaccen, polish_ispell, simple, ;
Run Code Online (Sandbox Code Playgroud)

遗憾的是,使用此配置无法正确创建词法:

select to_tsvector('polish_unaccented' ,'robi?');

'robil':1
Run Code Online (Sandbox Code Playgroud)

词素当然应该是:

'robi?':1
Run Code Online (Sandbox Code Playgroud)

所以下面不能返回true(这就是我认为我需要的):

select to_tsvector('polish_unaccented','robi?') @@ …
Run Code Online (Sandbox Code Playgroud)

postgresql full-text-search unaccent

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

如何像在 MySQL 中一样查询 PostgreSQL 枚举?

在 MySQL 中使用下表:

CREATE TABLE bob(foo ENUM('a','b','c'));

INSERT INTO bob (foo) VALUES ('a'),('b'),('c'),('a'),('a');

SELECT * FROM bob WHERE foo >= 2;
+------+
| foo  |
+------+
| b    |
| c    |
+------+
Run Code Online (Sandbox Code Playgroud)

使用 PostGres 中的下表:

CREATE TYPE stuff AS ENUM ('a', 'b', 'c');
INSERT INTO bob (foo) VALUES ('a'), ('b'), ('b'), ('c'), ('c');
SELECT * FROM bob WHERE foo > 2;
(HINT:  No operator matches the given name and argument type(s). You might need to add explicit type casts.) …
Run Code Online (Sandbox Code Playgroud)

postgresql enum where

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

Postgresql 无法使用 usermap 进行对等身份验证(提供的用户名 (^dbuser^) 和经过身份验证的用户名 (^sysuser^) 不匹配)

我正在尝试使用 usermap 对某些用户进行对等身份验证。我想要做的是映射用户邮件阅读器,如您所见:

postgres=# \du
                              List of roles
 Role name  |                   Attributes                   | Member of 
------------+------------------------------------------------+-----------
 mailreader |                                                | {}
 postgres   | Superuser, Create role, Create DB, Replication | {}
Run Code Online (Sandbox Code Playgroud)

进入系统的用户root,dovecot,postfix。因此,我编辑了我的pg_ident.conf并放置了以下内容:

mailmap         dovecot                 mailreader
mailmap         postfix                 mailreader
mailmap         root                    mailreader
Run Code Online (Sandbox Code Playgroud)

我还编辑pg_hba.conf并附加了以下内容:

local    mail        all                     peer map=mailmap
Run Code Online (Sandbox Code Playgroud)

当我尝试通过sudo psql -U mailreader -d mail命令连接时,我得到:

psql:致命:用户“mailreader”的对等身份验证失败

错误。

我还尝试了以下配置:

local    mail            all                                     ident map=mailmap
Run Code Online (Sandbox Code Playgroud)

没有任何进展。

我可以帮忙吗?

编辑 1

有关错误的日志是:

2017-06-27 19:10:10 UTC [1188-1] mailreader@mail LOG:  provided user name …
Run Code Online (Sandbox Code Playgroud)

postgresql authentication postgresql-9.4

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

防止 PostgreSQL 中的 DROP COLUMN

我可以阻止 DROP COLUMN 在 PostgreSQL 9 或 10 或更高版本中的特定表上成功吗?

我的应用程序对列永远存在而不是消失做了一些假设。我怕后来的程序员忘记这个约束。

我知道触发器可以触发来控制行的插入、修改和删除。但是DDL呢?我可以防止表结构发生某些变化吗?

安全可能是一种方式,为用户和角色分配权限。但是这些未来的程序员将被允许添加列,只禁止删除列。

担心恶意活动。我正在防御那些可能行动太快而无法记住大局的急切海狸。

postgresql ddl

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

与单列上的排序相比,两列上的排序非常慢

我正在使用 Postgres,我看到在两列上使用 order by 时,与仅在列上使用 order by 相比,我的查询慢了几个数量级。我在考虑的表中有大约 2950 万行。

以下是三个不同查询的结果:

仅按 id 排序:

EXPLAIN ANALYZE SELECT "api_meterdata"."id", "api_meterdata"."meter_id", "api_meterdata"."datetime", "api_meter"."id" FROM "api_meterdata" INNER JOIN "api_meter" ON ( "api_meterdata"."meter_id" = "api_meter"."id" ) ORDER BY "api_meterdata"."id" DESC LIMIT 100;
                                                                               QUERY PLAN                                                            

------------------------------------------------------------------------------------------------------------------------------------------------------------------------  
 Limit  (cost=0.44..321.49 rows=100 width=20) (actual time=0.407..30.424 rows=100 loops=1)    
   ->  Nested Loop  (cost=0.44..94824299.30 rows=29535145 width=20) (actual time=0.402..30.090 rows=100 loops=1)
         Join Filter: (api_meterdata.meter_id = api_meter.id)
         Rows Removed by Join Filter: 8147
         ->  Index Scan Backward using api_meterdata_pkey on api_meterdata  (cost=0.44..58053041.74 rows=29535145 …
Run Code Online (Sandbox Code Playgroud)

postgresql performance postgresql-performance

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

Postgres inet 数组包含单个 ip

要求:用户可以将单个 ips 或 ip 地址范围添加到数据库表(例如具有 ipAddressesinet[]类型的权限表)。我需要查询单个 ip 是否包含在 ipAddresses 字段数组中,该数组可以是 ip 地址数组或 ip 地址范围数组,也可以是两者。我试图添加这样的查询:

WHERE "ipAddresses" @> '192.168.1.5'::inet
Run Code Online (Sandbox Code Playgroud)

也喜欢这个

WHERE "ipAddresses" >> '192.168.1.5'::inet
Run Code Online (Sandbox Code Playgroud)

但没有运气。提前致谢。

id          uuid      NOT NULL  gen_random_uuid()
permissions uuid[]      
ipAddresses inet[]      
createdAt   timestamp with time zone        now()
updatedAt   timestamp with time zone        now()
Run Code Online (Sandbox Code Playgroud)

来源:pg 数组函数pg 网络地址函数

postgresql address

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