标签: postgresql

“存储过程”和“存储函数”有什么区别?

所以这个问题的评论提到,PostgreSQL 中的“存储过程”和“存储功能”略有不同。

评论链接到维基百科文章,但其中一些似乎并不适用(例如,它们可以在SELECT声明中使用)。

语法本身似乎有点混乱:

CREATE FUNCTION emp_stamp() RETURNS trigger AS $emp_stamp$
    BEGIN
       [...]
    END;
$emp_stamp$ LANGUAGE plpgsql;

CREATE TRIGGER emp_stamp BEFORE INSERT OR UPDATE ON emp
    FOR EACH ROW EXECUTE PROCEDURE emp_stamp();
Run Code Online (Sandbox Code Playgroud)

您创建了一个FUNCTION但将其称为PROCEDURE.

那么这两者有什么区别呢?

postgresql stored-procedures plpgsql

47
推荐指数
6
解决办法
5万
查看次数

WHERE 子句是否按照它们的编写顺序应用?

我正在尝试优化一个查询,该查询查看一个大表(3700 万行),并有一个关于在查询中执行操作的顺序的问题。

select 1 
from workdays day
where day.date_day >= '2014-10-01' 
    and day.date_day <= '2015-09-30' 
    and day.offer_id in (
        select offer.offer_day 
        from offer  
        inner join province on offer.id_province = province.id_province  
        inner join center cr on cr.id_cr = province.id_cr 
        where upper(offer.code_status) <> 'A' 
            and province.id_region in ('10' ,'15' ,'21' ,'26' ,'31' , ...,'557') 
            and province.id_cr in ('9' ,'14' ,'20' ,'25' ,'30' ,'35' ,'37')
    )
Run Code Online (Sandbox Code Playgroud)

WHERE日期范围的子句是否在子查询之前执行?将最严格的子句放在首位以避免其他子句的大循环,以便更快地执行是否是一种好方法?

现在查询需要很多时间来执行。

postgresql performance postgresql-performance

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

EXISTS (SELECT 1 ...) vs EXISTS (SELECT * ...) 一个还是另一个?

每当我需要检查表中某行是否存在时,我总是倾向于编写如下条件:

SELECT a, b, c
  FROM a_table
 WHERE EXISTS
       (SELECT *  -- This is what I normally write
          FROM another_table
         WHERE another_table.b = a_table.b
       )
Run Code Online (Sandbox Code Playgroud)

还有一些人这样写:

SELECT a, b, c
  FROM a_table
 WHERE EXISTS
       (SELECT 1   --- This nice '1' is what I have seen other people use
          FROM another_table
         WHERE another_table.b = a_table.b
       )
Run Code Online (Sandbox Code Playgroud)

当条件NOT EXISTS不是EXISTS: 在某些情况下,我可能会用 aLEFT JOIN和一个额外的条件(有时称为antijoin)来编写它:

SELECT a, b, c
  FROM a_table
       LEFT JOIN another_table ON another_table.b = …
Run Code Online (Sandbox Code Playgroud)

mysql postgresql oracle sql-server

47
推荐指数
5
解决办法
11万
查看次数

PostgreSQL 上的主动式自动清理

我试图让 PostgreSQL 积极地自动清空我的数据库。我目前已按如下方式配置自动真空吸尘器:

  • autovacuum_vacuum_cost_delay = 0 #关闭基于成本的真空
  • autovacuum_vacuum_cost_limit = 10000 #最大值
  • autovacuum_vacuum_threshold = 50 #默认值
  • autovacuum_vacuum_scale_factor = 0.2 #默认值

我注意到自动真空仅在数据库未加载时才会启动,因此我遇到死元组比活元组多得多的情况。有关示例,请参阅随附的屏幕截图。其中一张表有 23 个活动元组,但有 16845 个死元组等待真空。这太疯狂了!

很多死元组

当测试运行完成并且数据库服务器空闲时,自动真空开始,这不是我想要的,因为我希望自动真空在死元组数量超过 20% 活元组 + 50 时启动,因为数据库已经配置。服务器空闲时的自动真空对我来说是无用的,因为生产服务器预计会在持续时间内达到 1000 次更新/秒,这就是为什么即使服务器负载不足我也需要自动真空运行。

有什么我想念的吗?如何在服务器负载较重时强制运行自动吸尘器?

更新

这可能是一个锁定问题吗?有问题的表是通过插入后触发器填充的汇总表。这些表以 SHARE ROW EXCLUSIVE 模式锁定,以防止并发写入同一行。

postgresql performance vacuum performance-testing

46
推荐指数
5
解决办法
5万
查看次数

在 Postgres 9.2 上增加 work_mem 和 shared_buffers 会显着减慢查询速度

我有一个 PostgreSQL 9.2 实例,它在 RHEL 6.3、8 核机器上运行,内存为 16GB。服务器专用于此数据库。鉴于默认的 postgresql.conf 在内存设置方面相当保守,我认为允许 Postgres 使用更多内存可能是个好主意。令我惊讶的是,遵循wiki.postgresql.org/wiki/Tuning_Your_PostgreSQL_Server 上的建议实际上显着降低了我运行的每个查询的速度,但在更复杂的查询中显然更明显。

我还尝试运行 pgtune,它给出了以下建议并调整了更多参数,但这并没有改变任何东西。它建议 1/4 RAM 大小的 shared_buffers 这似乎符合其他地方的建议(特别是在 PG wiki 上)。

default_statistics_target = 50
maintenance_work_mem = 960MB
constraint_exclusion = on
checkpoint_completion_target = 0.9
effective_cache_size = 11GB
work_mem = 96MB
wal_buffers = 8MB
checkpoint_segments = 16
shared_buffers = 3840MB
max_connections = 80
Run Code Online (Sandbox Code Playgroud)

我尝试在更改设置后重新索引整个数据库(使用reindex database),但这也无济于事。我玩过 shared_buffers 和 work_mem。从非常保守的默认值 (128k / 1MB) 逐渐改变它们会逐渐降低性能。

我运行EXPLAIN (ANALYZE,BUFFERS)了一些查询,罪魁祸首似乎是 Hash Join 明显变慢了。我不清楚为什么。

举一些具体的例子,我有以下查询。它在默认配置下运行约 2100 毫秒,在增加缓冲区大小的配置上运行约 3300 毫秒: …

postgresql performance query-performance

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

MATCH FULL、MATCH SIMPLE 和 MATCH PARTIAL 之间的区别?

我注意到了MATCH SIMPLEMATCH FULL,但我不明白它们是做什么的。我看到默认是MATCH SIMPLE; 但是,约束函数的其他MATCH子句如何FOREIGN KEY

postgresql foreign-key constraint referential-integrity ddl

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

PostgreSQL 和 MySQL 的可扩展性限制

我听说非分片关系数据库(如 MySQL 或 PostgreSQL)的性能“突破”超过 10 TB。

我怀疑这样的限制确实存在,因为人们不会想出 Netezza、Greenplum 或 Vertica 等,但是我想问这里是否有人参考了任何研究论文或正式案例研究,其中量化了这些限制。

mysql postgresql scalability

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

在大表中填充新列的最佳方法?

我们在 Postgres 中有一个 2.2 GB 的表,其中有 7,801,611 行。我们正在向它添加一个 uuid/guid 列,我想知道填充该列的最佳方法是什么(因为我们想NOT NULL向它添加约束)。

如果我正确理解 Postgres,更新在技术上是删除和插入,所以这基本上是重建整个 2.2 gb 表。我们还有一个奴隶在运行,所以我们不希望它落后。

有没有比编写一个随着时间慢慢填充它的脚本更好的方法?

postgresql storage ddl

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

MD5 字段的最佳数据类型是什么?

我们正在设计一个众所周知的读取量大的系统(每分钟读取数万次)。

  • 有一个表names作为一种中央注册表。每行都有一个text字段representation和一个唯一的字段,key它是该字段的 MD5 哈希值representation1该表目前有数千万条记录,预计在应用程序的生命周期内会增长到数十亿条。
  • 还有许多其他表(具有高度变化的模式和记录计数)引用该names表。这些表之一中的任何给定记录都保证有一个name_key,它在功能上是names表的外键。

1:顺便说一句,正如您所料,此表中的记录一旦写入便不可变。

对于表以外的任何给定表names,最常见的查询将遵循以下模式:

SELECT list, of, fields 
FROM table 
WHERE name_key IN (md5a, md5b, md5c...);
Run Code Online (Sandbox Code Playgroud)

我想优化读取性能。我怀疑我的第一站应该是最小化索引的大小(尽管我不介意在那里被证明是错误的)。

问题:和列
的最佳数据类型是什么? 有理由使用over吗?或者?keyname_key
hex(32)bit(128)BTREEGIN

postgresql index database-design uniqueidentifier datatypes

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

如何在 PostgreSQL 的 Select 查询中使用默认值?

如果没有返回行,我想为应该使用的列使用默认值。这在 PostgreSQL 中可能吗?我该怎么做?或者我还有其他方法可以解决这个问题吗?

例如这样的事情:

SELECT MAX(post_id) AS max_id DEFAULT 0 FROM my_table WHERE org_id = 3
Run Code Online (Sandbox Code Playgroud)

如果org_id = 3表中没有行,我想返回0

postgresql aggregate select default-value

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