我正在 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) 我创建了这样的表(类似于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
我刚刚开始设计我的第一个 GIS 数据库,使用 PostGIS / PostgreSQL,我有一个关于几何和地理的问题,特别是存储几何是否更有效(因为它支持更多功能)然后在我需要时投影到地理它,或者我是否应该同时存储几何和重新投影的地理?
更详细地说,数据库将填充包含英国国家网格 (EPSG:27700) (OSGR) 和转换后的 WGS84 (EPSG:4326) 值的预先存在的数据,并且该数据将定期更新来自外部资源。这将争论两列,因为我不需要进行计算。
展望未来,我希望允许使用 OSM 或文本输入作为 OSGR 或通过 GPS 坐标通过“指向并单击”基于 Web 的地图应用程序编辑数据。搜索设施也将允许 OSGR 或纬度/经度。有两列意味着我总是必须至少对输入执行一次计算(尽管不是搜索),而只有一列意味着我有时可能需要计算输入,再次可能需要计算搜索。
我想我已经说服自己在我的表中同时需要几何和地理列(可能还需要每个列的投影列,以便我可以在未来的某个时间处理爱尔兰),但这是否明智?
谢谢。
我们正在尝试在 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 …
我希望能够在 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) 在 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) 我正在尝试使用 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)
没有任何进展。
我可以帮忙吗?
有关错误的日志是:
2017-06-27 19:10:10 UTC [1188-1] mailreader@mail LOG: provided user name …Run Code Online (Sandbox Code Playgroud) 我可以阻止 DROP COLUMN 在 PostgreSQL 9 或 10 或更高版本中的特定表上成功吗?
我的应用程序对列永远存在而不是消失做了一些假设。我怕后来的程序员忘记这个约束。
我知道触发器可以触发来控制行的插入、修改和删除。但是DDL呢?我可以防止表结构发生某些变化吗?
安全可能是一种方式,为用户和角色分配权限。但是这些未来的程序员将被允许添加列,只禁止删除列。
我不担心恶意活动。我正在防御那些可能行动太快而无法记住大局的急切海狸。
我正在使用 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) 要求:用户可以将单个 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)