标签: postgresql

如何在 PostgreSQL 中获取 regclass 类型表的模式名称?

在编写一个函数来测试表中是否col_name存在一列时_tbl,我想提取表的模式名称,该名称作为regclass参数传递给函数(为了安全??)。

CREATE OR REPLACE FUNCTION column_exists(_tbl regclass, col_name text)
  RETURNS bool AS
$func$
  SELECT EXISTS (
    SELECT 1 FROM information_schema.columns 
    WHERE table_schema=get_schema($1) 
      AND table_name=get_table($1) 
      AND column_name=$2
    );
$func$  LANGUAGE sql;
Run Code Online (Sandbox Code Playgroud)

所以如果表名是'staging.my_table'::regclass,我想staging从一个虚构的函数中获取get_schema

我可以用 eg 来实现这个功能split_part(_tbl::text, '.', 1)吗?

此外,是否保证表名_tbl在转换为文本时始终具有模式名称?(即不省略诸如public.

我对这种regclass类型不是很熟悉。我搜索但找不到如何提取模式名称,只想在重新发明轮子之前先询问。

postgresql catalogs system-tables regclass

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

归一化或不归一化

总的来说,我知道即使有加入成本,规范化通常也是有益的。然而,我最近想到了一个有趣的困境。

如果数据重复但不太可能改变怎么办。这是可能的,但我不会预料到。

我有一个nutrients表,一unit列和单位将gkgug,等。

我看不到这些值每次都在变化。

我很想将它们作为表中的一列,而不是规范化并拥有一个units表并使用外键并且在从nutrients表中获取一行时必须加入。同时,我知道总的来说,即使有加入币,我们也应该正常化。

我应该怎么做(以及为什么)?

postgresql normalization database-design

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

给“超级”用户更多的 work_mem

多年来我注意到的一种常见模式是,人们倾向于随着数据大小的增加而不断增加工作内存,因此更复杂的查询仍然可以充分利用内存速度,但对于某些极端任务(例如,报告)。

仅对一些很少运行的异常查询大幅增加该数字可能是有利的。例如,我可能想保持work_mem在例如。8 MB 用于正常操作,然后使用具有 250 MB 工作内存之类的特定客户端/用户运行特定查询,以便我可以在单个会话期间完全在内存中快速执行重大操作。

这可能吗?我是否完全不考虑将其视为解决方案?

postgresql memory configuration

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

调用 volatile 函数时,函数可以是不可变的吗?

我有一个函数可以进行一些数学计算。它调用另一个易变的函数。我想知道调用函数是否可以声明为immutableor stable,或者它也必须声明为volatile

postgresql functions

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

Postgresql - 如何安全删除删除表时释放的存储?

对于存储在 PostgreSQL 9.5 数据库中的敏感信息的系统,必须安全地删除存储在表中的数据被删除(就像shred文件一样),并且即使特定数据集不会被删除,系统也是持久的,我正在尝试找出在删除表时安全删除基础数据文件的选项。

作为背景,我不是 DBA,但我是许多语言、上下文和数据库方面的经验丰富的实施者。我已经看过了,但一直没能找到一种方法来要求 PostgreSQLshred在表被DROPped时将它们释放到操作系统之前做相当于ding 其底层文件的工作。是否有内置方法可以要求 PostgreSQL 执行此操作?(我可能只是没有找到正确的东西 - 如果我错过了什么,我很抱歉,我很乐意接受滥用以及相关文档的链接)

我们正在查看的部分答案是在删除表之前手动粉碎给定关系及其索引的底层数据文件,但这不是那么优雅,我不确定它是否从表中获取所有信息我们需要删除。

我们还在研究粉碎数据磁盘上可用空间的策略 - 要么运行实用程序来执行此操作,要么定期复制数据卷,交换副本的结果,然后粉碎作为源的整个卷,以便其“可用”空间在此过程中被安全地覆盖。

我们错过了什么吗?还有其他我们没有找到的选择吗?如果我们必须手动清理,除了数据库文件夹中给定表的关系文件及其所有相关索引之外,还有其他地方需要粉碎数据吗?任何帮助或建议将不胜感激。

postgresql security drop-table

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

如何计算 PostgreSQL 中的布尔值?

如何计数,postgresql 用户表中公共字段的真假如何我试过这个查询

select 
sum(case when false then 1 else 0 end) as false, 
sum(case when true then 1 else 0 end) as true
from  public.user;
Run Code Online (Sandbox Code Playgroud)

但我没有得到任何价值,如果我从查询中删除 public 那么我将得到正确的计数,只有我的值为 true

table : name|   DOB     | public
values : bb | 20/2/1991/| true

op : true = 1 and false  = 0
Run Code Online (Sandbox Code Playgroud)

但是当我公开为假时,我得到了相同的答案

table : name|   DOB     | public
values : bb | 20/2/1991/| false

op : true = 1 and false  = 0
Run Code Online (Sandbox Code Playgroud)

所以有人请帮我解决这个问题

postgresql postgresql-9.4

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

具有有效性间隔的可移植表设计(历史化、时态数据库)

我正在为一个应用程序设计一个数据模型,它必须跟踪数据的变化。

第一步,我的应用程序必须支持PostgreSQL,但我想在第二步中添加对其他 RDBMS(尤其是 Oracle 和 MS SQL 服务器)的支持。因此,我想选择使用较少专有功能的便携式数据模型。(表的 DDL 可能因 RDBMS 供应商而异。但应用程序中的 SQL 查询/语句对于所有支持的供应商应尽可能相同。)

例如,假设有users一张users_versions桌子。users_versions在 上有一个外键users

表的示例可能如下所示:

users
----------------
id | username
---------------- 
 1 | johndoe
 2 | sally

users_versions --> references id of user (userid)
---------------------------------------------------------------------------
id | userid | name     | street      | place     | validfrom  | validuntil
---------------------------------------------------------------------------
 1 |      1 | John Doe | 2nd Fake St | Faketown  | 2018-01-04 | 2018-01-05
 2 |      1 …
Run Code Online (Sandbox Code Playgroud)

postgresql index oracle database-design sql-server

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

计算每行 NULL 值

我想在不枚举列名的情况下计算表中每行存在的空值数。例如:

WITH t as (VALUES
  (NULL ,'hi',2,NULL,'null'),
  ('' ,'hi',2,3,'test'),
  (NULL ,'hi',2,3,'null')
)
SELECT countnulls(t)
FROM t;
Run Code Online (Sandbox Code Playgroud)

会导致:

numnulls
2
0
1
Run Code Online (Sandbox Code Playgroud)

我能得到的最接近的是以下黑客row_to_json()

select 
(CHAR_LENGTH(row_to_json(t)::text)
 - CHAR_LENGTH(REPLACE(row_to_json(t)::text, 'null', '')))/4 from t;
Run Code Online (Sandbox Code Playgroud)

这是......相当的黑客(不是很好)。它可以工作,有点,但是当它出现在实际数据或列名中时,它会将字符串 'null' 计为 NULL。所以在上述情况下是不正确的。

postgresql null isnull postgresql-9.6

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

Postgres 性能测试、缓存和刷新

我一直在对各种 postgres SQL 查询进行一些测试。

测试通常涉及更改查询的语法、更改表连接或偶尔完全重写查询。

我注意到有时我会得到“明显”的大幅性能提升。我将运行一个查询,运行需要(比如)60 秒,我会做一个小改动,然后运行(比如)5 秒。

起初我认为这是因为我的小调整提高了性能。我已经意识到实际上必须有一些缓存正在进行,(要看到这一点,请尝试运行 60 秒的查询,然后几秒钟后再次运行它 - 它总是第二次运行得更快),我假设这个是因为数据已经在本地缓存在某处,所以当数据需要第二次读取时,它已经到手了。

我确信这是一个有用的性能特性,但它确实使得在调整查询时很难发现真正的性能改进。是否可以在每次执行之前刷新缓存以确保每个测试从同一位置开始?

谢谢

postgresql performance postgresql-performance

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

pg_stat_all_tables.last_autovacuum 什么时候更新?

我期待与我们的自动清理的问题,并试图了解last_autoanalyzelast_autovacuumpg_stat_all_tables

我理解 autovacuum 以增量方式工作,批量压缩和清理死元组,然后休眠片刻,等等。那么是什么last_autovacuum意思?是否有可能 autovacuum大部分时间都在工作,但时间戳可能永远不会更新(例如,因为无法删除元组)?

我看到的许多表的时间戳都很旧,尽管我相当确定我在某些表上观察到了一个正在运行的 autovacuum 线程。

编辑:如果我不清楚,我的问题是:确实last_autovacuum意味着......

  • 增量 autovacuum 进程最后完成此表上的大量工作并休眠的时间
  • autovacuum 过程一直工作到桌子最后的时间
  • 以上,但前提是没有无法删除的元组
  • 别的东西

postgresql autovacuum

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