标签: postgresql

查询中的 PostgreSQL 分区不起作用

所以我有一个真正的休息日什么的,但对于我的生活,我无法弄清楚这一点。我想分tier1total获得总数的百分比。我是这样想的:

(tier1 / total) as per
Run Code Online (Sandbox Code Playgroud)

但没有运气。我将这些 CAST 作为 int 并且仍然没有。我会得到一个错误并且查询不会执行,或者我会得到一个值 0。

这是我正在尝试使用的内容:

SELECT count(student_id) as total
,(SELECT count(fall_september_tier) FROM national_assessments.aimsweb WHERE general_outcome_measure = 'PSF' AND fall_september_tier = 1) as tier1
,(SELECT count(fall_september_tier) FROM national_assessments.aimsweb WHERE general_outcome_measure = 'PSF' AND fall_september_tier = 2) as tier2
,(SELECT count(fall_september_tier) FROM national_assessments.aimsweb WHERE general_outcome_measure = 'PSF' AND fall_september_tier = 3) as tier3
FROM national_assessments.aimsweb
WHERE general_outcome_measure = 'PSF' AND fall_september_tier IS NOT NULL
Run Code Online (Sandbox Code Playgroud)

我也有这个想法,但没有运气:

SELECT tier1,total, tier1/total as test …
Run Code Online (Sandbox Code Playgroud)

postgresql aggregate datatypes count

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

可以使用 PostgreSQL 触发器来忽略插入吗?

我遇到过这样的情况,我们的数据库中有几十个不同的触发器,它们触发将记录插入到数据库中的另一个(单个)表中。

我希望在测试我们的替换服务器时,有一些简单的方法可以在该单个表上设置触发器以有效地忽略所有其他触发器。(而不是必须删除数十个触发器,然后在我们投入生产时重新启用它们)。

我希望能够使用INSTEAD OF INSERT设置为不执行任何操作的函数的触发器,但您只能在视图上使用这些触发器,而不能在表上使用。我尝试了一个BEFORE INSERT 名为的触发器RAISE EXCEPTION,但这导致整个事务失败,因此对其他表的修改也被拒绝。

是否有一些简单的方法可以忽略对该表​​的插入,或者我应该做一个AFTER INSERT事后清除记录的操作?

postgresql trigger

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

尝试在 Postgres 9.3 上设置新的 data_directory

Ubuntu 14.04,最近安装了 Postgres 9.3。

尝试为附加的更大硬盘驱动器 (/data) 设置新的 data_directory,我更改了 postgresql.conf 文件以反映这一点。

但是,尝试重新启动服务器时出现此错误:

user@server:/etc/postgresql/9.3/main$ sudo /etc/init.d/postgresql restart
 * Restarting PostgreSQL 9.3 database server                                     
 * Error: pid file is invalid, please manually kill the stale server process.
Run Code Online (Sandbox Code Playgroud)

我没有太多设置 Postgres 的经验,所以我不确定从这里开始做什么,而且谷歌搜索也没有提供快速答案。

postgresql postgresql-9.3

7
推荐指数
2
解决办法
7458
查看次数

为什么 to_char 不是 IMMUTABLE,我该如何解决?

如何索引to_char()列的 a ?

我试过了:

adam_db=> CREATE INDEX updates_hourly_idx 
          ON updates (to_char(update_time, 'YYYY-MM-DD HH24:00'));
Run Code Online (Sandbox Code Playgroud)

但是得到了错误:

错误:必须标记索引表达式中的函数 IMMUTABLE

这看起来很奇怪,因为to_char()时间戳是相当不可变的。

任何想法如何生成该索引?

postgresql index string-representation

7
推荐指数
1
解决办法
4704
查看次数

从 plpgsql 中的文本动态转换

我的数据库中的许多表共享一个公共布局,特别是它们有一个serial以关系名称命名的主键。从 Web 应用程序中更新这些表通常涉及以下形式的查询:

UPDATE table SET attribute = x WHERE table_id = y
Run Code Online (Sandbox Code Playgroud)

这很常见,以至于我有一个执行此任务的存储过程:

CREATE OR REPLACE FUNCTION setvalue(
    relname text,
    row_id integer,
    colname text,
    newvalue text)
RETURNS void AS
$BODY$
BEGIN
  EXECUTE format('UPDATE %I SET %I = $1 WHERE %I = $2', relname, colname, relname || '_id', colname) USING row_id;
END;
$BODY$
LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

不幸的是,这不适用于非文本类型。例如,更新一date列给出ERROR: column ... is of type date but expression is of type text. 假设文本是预期类型的​​有效文字表示,是否有一种安全的方法让 DBMS 找出正确的类型并做正确的事情?

postgresql dynamic-sql plpgsql

6
推荐指数
1
解决办法
836
查看次数

pg_dump:找不到匹配的模式

我正在尝试从 Postgres 9.4 转储模式,在 Cents 6.5 上运行,但出现错误:

pg_dump:找不到匹配的模式

这是我正在运行的命令:

pg_dump -U postgres -n "OLD-TODELETE-bushes" --verbose site > output_nf
Run Code Online (Sandbox Code Playgroud)

我对此有点困惑,因为当我运行时select schema_name from information_schema.schemata,我可以看到架构名称。

如果我为所有模式运行 pg_dump,则按OLD-TODELETE-bushes预期将其转储到文件中。

Postgres 日志中没有错误。

谁有想法?

postgresql pg-dump postgresql-9.4 case-sensitive

6
推荐指数
1
解决办法
3349
查看次数

使用 Postgres 9.4.4 和 Amazon Web Services 复制特定表

我目前在 Amazon Web Services 上设置了一个Postgres 9.4.4 RDS实例。在这个实例中,我持有 20 张桌子。此外,我还在我的本地服务器(操作系统:64 位 Linux)上安装了 Postgres 9.4.4,它在一个数据库下保存了大约 30 个表。云实例和我的本地服务器实例都有重叠的表,即云上有一些我复制到本地的表,反之亦然。我不太熟悉 Postgres 复制过程,因为我从来不需要它们,而且目前通过 python 脚本在这两个数据库之间读/写/附加表的传输效率很低。

我将不胜感激来自社区的任何关于最佳程序的指导。理想情况下,我想要一个解决方案,其中云上的某些表可以在本地成为 MASTER 和 SLAVE,并允许其他其他表在本地成为 MASTER,在云中成为 SLAVE。这可能吗?

听说过 Burcardo 或 Slony 可以做到这一点吗?这方面的任何好的文档/站点也会有所帮助。

postgresql replication transactional-replication postgresql-9.4 amazon-rds

6
推荐指数
1
解决办法
520
查看次数

使用多个表中的列提高 order by 的性能

使用 PostgreSQL 8.4,我试图使用 order by 和两个表的索引列查询两个包含 100 万条记录的表,并且我正在失去性能(1 列需要 30 毫秒,两列需要 5 分钟)。例如:

select r.code, r.test_code, r.sample_code, s.barcode, s.registry_date
from requests r
inner join samples s on (s.code = r.sample_code)
order by s.barcode  asc , r.code asc
limit 21;
Run Code Online (Sandbox Code Playgroud)

表信息:

CREATE TABLE public.samples (
  code BIGINT NOT NULL,
  barcode VARCHAR(40) NOT NULL,
  registry_date TIMESTAMP WITH TIME ZONE NOT NULL,
  CONSTRAINT samples_pkey PRIMARY KEY(code)
);

CREATE INDEX idx_samp_barcode ON public.samples (barcode);
CREATE INDEX idx_samp_barcode_code ON public.samples (barcode, code);
CREATE INDEX …
Run Code Online (Sandbox Code Playgroud)

postgresql performance postgresql-8.4 recursive postgresql-performance

6
推荐指数
1
解决办法
2237
查看次数

添加订单子句时不使用 GIN 索引

我正在尝试加速执行三个ILIKE查询的查询并使用 or 减少这些查询(返回总计数和 10 个条目)

SELECT  *, count(*) OVER() as filtered_count FROM "users" 
WHERE (
   (f_unaccent("users"."first_name") ILIKE f_unaccent('%foo%') OR 
    f_unaccent("users"."last_name") ILIKE f_unaccent('%foo%')) OR 
    f_unaccent("users"."club_or_hometown") ILIKE f_unaccent('%foo%')
) LIMIT 10 OFFSET 0
Run Code Online (Sandbox Code Playgroud)

在为所有查询的属性添加 gin-indexes 后,这工作得相当快(这里仅适用于 first_name):

CREATE INDEX users_first_name_gin
ON users
USING gin
(f_unaccent(first_name::text) COLLATE pg_catalog."default" gin_trgm_ops);
Run Code Online (Sandbox Code Playgroud)

然而,如果我添加一个额外的 order 子句,例如ORDER BY users.first_name ASC,postgresql 不使用 gin 索引,而是使用正常的 b-tree 索引 on first_name,然后过滤结果。这在我的应用程序中需要更长的时间。即使对于有序查询,我如何调整查询/索引以继续使用 gin 索引?

编辑:我使用的是 postgresql 9.4

无序查询的解释:

"Limit  (cost=125.98..139.61 rows=10 width=58) (actual time=17.828..17.833 rows=10 loops=1)"
"  -> …
Run Code Online (Sandbox Code Playgroud)

postgresql index full-text-search

6
推荐指数
1
解决办法
2091
查看次数

是什么导致大 INSERT 变慢和磁盘使用量激增?

我有一个大约 310 万行的表,其定义和索引如下:

CREATE TABLE digiroad_liikenne_elementti (
    ogc_fid serial NOT NULL,
    wkb_geometry geometry(Geometry,4258),
    tiee_tila numeric(9,0),
    vaylatyypp numeric(9,0),
    toiminnall numeric(9,0),
    eurooppati character varying(254),
    kansalline numeric(9,0),
    tyyppi numeric(9,0),
    liikennevi numeric(9,0),
    ens_talo_o numeric(9,0),
    talonumero numeric(9,0),
    ens_talo_v numeric(9,0),
    oik_puol_t character varying(254),
    tieosan_ta numeric(9,0),
    viim_talo_ numeric(9,0),
    viim_tal_1 numeric(9,0),
    vas_puol_t character varying(254),
    laut_tyypp numeric(9,0),
    lautta_lii numeric(9,0),
    inv_paalu_ numeric(19,11),
    inv_paal_1 numeric(19,11),
    liitalue_o numeric(9,0),
    ketju_oid numeric(9,0),
    tietojoukk numeric(9,0),
    ajoratanum numeric(4,0),
    viite_guid character varying(254),
    "timestamp" date,
    tiee_kunta numeric(9,0),
    toissij_ti character varying(254),
    viite_oid numeric(9,0),
    k_elem_id numeric(9,0),
    region character varying(40) DEFAULT …
Run Code Online (Sandbox Code Playgroud)

postgresql performance insert postgresql-9.3 write-ahead-logging postgresql-performance

6
推荐指数
2
解决办法
4203
查看次数