标签: postgresql

用 plpgsql 编写的函数调用的 Postgres 查询计划

它使用的时候可能pgadmin还是plsql获得查询计划的搁置了内部执行SQL语句ü SER d efined ˚F油膏(UDF)使用EXPLAIN。那么我如何掌握 UDF 的特定调用的查询计划呢?我看到 UDF 抽象为F()pgadmin 中的单个操作。

我查看了文档,但找不到任何内容。

目前我正在提取语句并手动运行它们。但这不会减少大型查询。

例如,考虑下面的 UDF。这个 UDF,即使它能够打印出它的查询字符串,也不能使用复制粘贴,因为它有一个本地创建的临时表,当你粘贴和执行它时它不存在。

CREATE OR REPLACE FUNCTION get_paginated_search_results(
    forum_id_ INTEGER,
    query_    CHARACTER VARYING,
    from_date_ TIMESTAMP WITHOUT TIME ZONE DEFAULT NULL,
    to_date_ TIMESTAMP WITHOUT TIME ZONE DEFAULT NULL,
    in_categories_ INTEGER[] DEFAULT '{}')
RETURNS SETOF post_result_entry AS $$
DECLARE
    join_string CHARACTER VARYING := ' ';
    from_where_date CHARACTER VARYING := ' ';
    to_where_date CHARACTER VARYING := ' ';
    query_string_ CHARACTER VARYING …
Run Code Online (Sandbox Code Playgroud)

postgresql performance plpgsql functions

23
推荐指数
2
解决办法
8167
查看次数

在热备服务器上运行 pg_dump?

免责声明:我承认我还没有尝试过这个,但我不确定我是否会知道它是否工作不正常,所以我想问一下。

我想pg_dumpall从运行流式复制的热备用服务器运行夜间备份作业(通过),以避免将负载置于主服务器上。我只看到提到人们遇到的一些问题,例如这里这里,但很少有指导。如果备份稍微落后于主要,只要它是一致的(它应该是一致的)就可以了。

我的问题是:

  1. 我真的想这样做,还是应该在主服务器上进行备份?为什么?

  2. 在备用服务器上进行转储时,我需要哪些设置以及应该使用哪些程序来正确执行此操作?例如,我必须在备份期间停止复制吗?

postgresql replication backup

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

错误:数据库“dbname”不存在

根据文档,只要我没有连接到数据库,我就可以使用以下命令在控制台中删除数据库:

DROP DATABASE dbname;
Run Code Online (Sandbox Code Playgroud)

或者我可以使用包装器工具删除它dropdb

两者都给我一个错误,说数据库不存在,但是当在控制台中输入命令时\l,我得到一个数据库列表,包括我想删除的数据库。

                                          List of databases
           Name            |   Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   
---------------------------+-----------+----------+-------------+-------------+-----------------------
 Blog_development          | myusername | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 Blog_test                 | myusername | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
Run Code Online (Sandbox Code Playgroud)

数据库名称是 Blog_development(以及它下面的名称)。我在玩 rails 并试图从在线文档中学习。我想重新开始并删除所有内容。

然而,当试图删除它时,它说它不存在。我是 PostgreSQL 的新手,所以我有点迷茫,除了在它不存在时弹出之外,文档中没有关于此错误的任何内容。它当然存在,它就在那里。

postgresql

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

显示用户定义的类型及其详细信息

我在 PostgreSQL 中创建了一些新的 UDT。但是,现在我有两个问题:

  1. 如何查看定义了哪些 UDT?
  2. 如何查看这些 UDT 中定义的列?

不幸的是,我在 PostgreSQL 文档中找不到任何相关内容。

postgresql catalogs user-defined-type

23
推荐指数
3
解决办法
3万
查看次数

如何针对更新(软件和硬件)的大量 I/O 优化数据库

情况 我有一个 postgresql 9.2 数据库,它一直都在大量更新。因此系统受 I/O 限制,我目前正在考虑进行另一次升级,我只需要一些关于从哪里开始改进的指导。

以下是过去 3 个月情况的图片:

在此处输入图片说明

如您所见,更新操作占磁盘利用率的大部分。这是另一张更详细的 3 小时窗口中情况的图:

在此处输入图片说明

如您所见,峰值写入速率约为 20MB/s

软件 服务器运行 ubuntu 12.04 和 postgresql 9.2。更新类型通常在由 ID 标识的单个行上进行小更新。例如UPDATE cars SET price=some_price, updated_at = some_time_stamp WHERE id = some_id。我已经尽可能多地删除和优化了索引,并且服务器配置(linux 内核和 postgres conf)也非常优化。

硬件 硬件是一个专用服务器,带有 32GB ECC ram、RAID 10 阵列中的 4 个 600GB 15.000 rpm SAS 磁盘,由带有 BBU 的 LSI RAID 控制器和英特尔至强 E3-1245 四核处理器控制。

问题

  • 对于这种口径(读/写)的系统,图表所看到的性能是否合理?
  • 因此,我应该专注于进行硬件升级还是深入研究软件(内核调整、confs、查询等)?
  • 如果进行硬件升级,磁盘数量是性能的关键吗?

- - - - - - - - - - - - - - - 更新 …

postgresql performance update hardware

23
推荐指数
2
解决办法
3万
查看次数

为什么要在文本列上索引 text_pattern_ops ?

今天七周内的七个数据库向我介绍了每个操作员的索引。

您可以通过创建text_pattern_ops运算符类索引来为匹配先前查询的模式索引字符串,只要值以小写形式索引即可。

CREATE INDEX moves_title_pattern ON movies (
    (lower(title) text_pattern_ops);
Run Code Online (Sandbox Code Playgroud)

我们使用 是text_pattern_ops因为标题是文本类型。如果需要指数VARCHAR处理,字符,或名称,使用相关的OPS: ,varchar_pattern_opsbpchar_pattern_opsname_pattern_ops

我觉得这个例子真的很混乱。为什么这样做有用?

如果该列是文本类型,那么在用作搜索值之前,其他类型(varchar、char、name)不会被强制转换为文本吗?

该索引的行为与使用默认运算符的索引有何不同?

CREATE INDEX moves_title_pattern ON movies (lower(title));
Run Code Online (Sandbox Code Playgroud)

postgresql index collation pattern-matching

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

pg_restore: [archiver] 在文件头中没有找到魔法字符串

我正在使用 PostgreSQL 9.1 并希望恢复使用pg_dump以下命令生成的备份文件:

sudo pg_dump -h 127.0.0.1 -U postgres --clean --inserts -E UTF8 -f out.sql database_name
Run Code Online (Sandbox Code Playgroud)

该命令生成一个有效的 sql 文件,首先删除任何现有的数据库对象,然后生成所有表、索引、序列等,最后插入数据。

当我尝试使用以下方法恢复生成的备份文件时:(添加换行符仅用于显示目的)

sudo pg_restore 
    -d database_name -h 127.0.0.1 -U postgres
    --format=c --clean --create out.sql
Run Code Online (Sandbox Code Playgroud)

它失败并打印:

pg_restore: [archiver] did not find magic string in file header
Run Code Online (Sandbox Code Playgroud)

这是什么原因?

postgresql backup postgresql-9.1 pg-dump

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

在 PostgreSQL 中查询 JSONB

我有一个表,persons它包含两列,一个id和一个基于 JSONB 的data列(这个表只是为了演示目的而制作的,以使用 PostgreSQL 的 JSON 支持)。

现在,假设它包含两条记录:

1, { name: 'John', age: 30 }
2, { name: 'Jane', age: 20 }
Run Code Online (Sandbox Code Playgroud)

现在,假设我想得到每个 25 岁以上的人的名字。我尝试过的是:

select data->'name' as name from persons where data->'age' > 25
Run Code Online (Sandbox Code Playgroud)

不幸的是,这会导致错误。我可以通过使用->>代替来解决它->,但是比较不再按预期工作,因为不是比较数字,而是比较它们作为字符串的表示:

select data->'name' as name from persons where data->>'age' > '25'
Run Code Online (Sandbox Code Playgroud)

然后我发现我实际上可以通过使用->和强制转换来解决这个问题int

select data->'name' as name from persons where cast(data->'age' as int) > 25
Run Code Online (Sandbox Code Playgroud)

这有效,但我必须知道实际类型并不是那么好(ageJSON 文档中的类型是number无论如何,那么为什么 PostgreSQL …

postgresql cast json operator postgresql-9.5

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

ALTER TABLE 上的数据库“冻结”

我们的生产环境今天早上在更改表时冻结*了一段时间,实际上是添加了一列。

违规 SQL:ALTER TABLE cliente ADD COLUMN topicos character varying(20)[];

* 登录到我们的系统需要从同一张表中进行选择,因此在更改表期间没有人可以登录。我们实际上不得不终止进程以让系统恢复正常运行。


表结构:

CREATE TABLE cliente
(
  rut character varying(30) NOT NULL,
  nombre character varying(150) NOT NULL,
  razon_social character varying(150) NOT NULL,
  direccion character varying(200) NOT NULL,
  comuna character varying(100) NOT NULL,
  ciudad character varying(100) NOT NULL,
  codigo_pais character varying(3) NOT NULL,
  activo boolean DEFAULT true,
  id serial NOT NULL,
  stock boolean DEFAULT false,
  vigente boolean DEFAULT true,
  clase integer DEFAULT 1,
  plan integer DEFAULT 1,
  plantilla character varying(15) …
Run Code Online (Sandbox Code Playgroud)

postgresql alter-table blocking postgresql-9.4

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

删除其他表中未引用的行

我在 PostgreSQL 9.3 数据库中有两个表: Tablelink_reply有一个which_group指向 table的外键link_group

我想删除link_grouplink_reply存在相关行的所有行。听起来很基本,但我一直在努力。

会不会像这样简单(不工作)?

DELETE FROM link_group WHERE link_reply = NULL;
Run Code Online (Sandbox Code Playgroud)

postgresql join delete postgresql-9.3

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