我正在使用触发器使用“经典”基于时间的分区。我发现需要一个单独的触发器,它在原始表上运行。
CREATE TABLE twitter_interactions(...);
CREATE OR REPLACE FUNCTION insert_twitter_interactions ...;
CREATE TRIGGER insert_twitter_interactions_trig
BEFORE INSERT OR UPDATE on twitter_interactions
FOR EACH ROW EXECUTE PROCEDURE insert_twitter_interactions();
CREATE OR REPLACE FUNCTION maintain_data_pointers ...;
CREATE TRIGGER maintain_data_pointers_trig
BEFORE INSERT OR UPDATE on twitter_interactions
FOR EACH ROW EXECUTE PROCEDURE insert_twitter_interactions();
Run Code Online (Sandbox Code Playgroud)
我还没有完全验证,但我怀疑分区逻辑在维护触发器之前运行,并且由于该行没有出现在父表中,因此第二个触发器永远不会触发。
如果我也想运行,会发生什么AFTER INSERT OR UPDATE?由于该行未将其放入原始表中,因此我无法实现 after 逻辑。
来自 PostgreSQL 文档:
为了获得最佳吞吐量,活动连接的数量应该接近 ((core_count * 2) + Effective_spindle_count)
调整你的 PostgreSQL 服务器 -> max_connections
通常,良好硬件上的 PostgreSQL 可以支持几百个连接。
对我来说——不是一个有经验的 DBA——这里的某个地方存在差异,特别是查看一些 DB 即服务提供商的产品。
例如,此时 Amazon RDS 最大的机器 (db.r3.8xlarge) 有 32 个 vCPU,根据第一个公式,如果有很多磁盘,它可能会在池中有 100 个连接的情况下以最佳方式运行。使用第二个公式中的“几百个连接”,它会不会运行得很糟糕?
更极端的是另一家 DBaaS 提供商的差异,他们提出了一个具有 500 个并发连接的 2 核服务器。这怎么可能运作良好?
如果我误解了什么,请告诉我。非常感谢!
我想知道这在 Postgres 中是否可行:
最好用一个人为的例子来解释:
create or replace function test_function(filter_param1 varchar default null
, filter_param2 varchar default null)
returns integer as
$$
declare
stmt text;
args varchar[];
wher varchar[];
retid integer;
begin
if filter_param1 is not null then
array_append(args, filter_param1);
array_append(wher, 'parameter_name = $1');
end if;
if filter_param2 is not null then
array_append(args, filter_param2);
array_append(wher, 'parameter_name = $2');
end if;
stmt := 'select id from mytable where ' || array_to_string(wher, ' or ');
execute stmt into retid using args;
return retid; …Run Code Online (Sandbox Code Playgroud) 在 PostgreSQL (9.3) 数据库中,我的 Accounts 和 Customers 之间是一对多的关系,因此在 Customers 表中,我有每个 Customer 的主键的全局唯一 id,以及相应的 Account id。但我还想为每个人分配一个特定于帐户的 ID - 只是一个数字,每个帐户的第一个客户从 1 开始,每个额外的客户递增 - 只是作为帐户中的用户在 UI 中引用客户的一种简单方法.
我可以想到两种可能的解决方案:
使用max()聚合函数获取用于 Account 的最后一个 Customer id 并将其递增
用一个 sequence
sequence某种方式为每个新帐户创建一个单独的帐户(然后在删除帐户时/当删除帐户时将其删除),否则每个帐户将在其客户 ID 序列中得到不连续的值更新
为了澄清最后一点,id 序列中总会出现一些差距;例如,一旦客户被删除,但这些都是意料之中的。除此之外,添加几个新客户的用户通常会希望他们有连续的 id,即使他们相隔几天添加。
OTOH,sequence为所有客户使用一个单一的客户几乎肯定会看到由分配给同时为其他账户创建的客户的 id 引入的常规的、无法解释的差距。
我不是 Postgres 专家,所以我担心我可以多么健壮地实现其中任何一个,尤其是当我一直在努力寻找任何可以遵循的示例时。
有没有普遍接受的方法来做到这一点?
对于拥有超过 300,000 个帐户(并且还在增长)的大型 SAAS 应用程序(由 PostgreSql 9.4 提供支持),使用每个帐户的模式对数据进行分区与将所有数据放在一个模式中并使用外键进行分区的优缺点是什么?在查询中对其进行分区?
我知道过去 pg_dump 在处理许多模式时非常缓慢,但不确定今天是否如此。我也知道必须对所有模式进行数据库结构的任何更改。而且我知道从好的方面来说,将模式从一个物理服务器移动到另一个很容易,以及从备份中恢复模式,更不用说以这种方式对数据进行分区是有意义的。
那么我缺少的优点和缺点是什么?
使用 PostgreSQL 9.4,我想要一个只考虑min()距离 onJOIN或 的(所有聚合函数)值的结果WHERE。但似乎这些事情是不允许的。所以,我选择两点之间的距离,我想过滤它只是为了考虑这些min()值。
为了清楚地继续这个问题,假设这些行:
id; gid; distance; time_interval
142; 028; 62; "21:46:00"
200; 028; 53; "08:20:11"
128; 034; 92; "09:24:43"
179; 034; 70; "08:09:34"
194; 034; 92; "05:31:05"
199; 034; 88; "07:15:48"
200; 034; 61; "14:13:43"
202; 035; 24; "17:32:34"
200; 036; 76; "06:02:11"
154; 037; 97; "12:58:58"
154; 040; 30; "11:34:10"
132; 042; 80; "07:01:12"
142; 042; 67; "19:30:21"
Run Code Online (Sandbox Code Playgroud)
我怎样才能提取id, gid,distance和time_interval只考虑min(time_interval) …
我面临以下错误:
Run Code Online (Sandbox Code Playgroud)ERROR: functions in index expression must be marked IMMUTABLE
尝试创建这样的索引时:
CREATE INDEX full_phone_number ON orders_clientphone (concat(area_code, phone));
Run Code Online (Sandbox Code Playgroud)
另一方面,当使用替代语法进行连接时:
CREATE INDEX full_phone_number ON orders_clientphone ((area_code || phone));
Run Code Online (Sandbox Code Playgroud)
Postgres 对此非常满意。
两列都定义为character varying(256)。
我正在尝试构建一个查询以将旧表中的多个列聚合在一起,该表存储在类似的结构中,如下所示:
CREATE TEMPORARY TABLE foo AS
SELECT * FROM ( VALUES
(1,'Router','Networking','Sale',NULL),
(2,NULL,'Router','Networking','Sale'),
(3,NULL,NULL,'Networking','Sale'),
(4,NULL,NULL,NULL,NULL)
) AS t(id,tag_1,tag_2,tag_3,tag_4);
Run Code Online (Sandbox Code Playgroud)
这是我要构建的查询的示例:
SELECT ID, json_build_array(Tag_1, Tag_2, Tag_3, Tag_4) AS tags
FROM table
Run Code Online (Sandbox Code Playgroud)
问题是上面的查询将行中的 NULL 值添加到数组中:
ID Tags
--------------------------------------------------
1 ['Router', 'Networking', 'Sale', null]
2 [null, 'Router', 'Networking', 'Sale']
3 [null, null, 'Networking', 'Sale']
4 [null, null, null, null]
Run Code Online (Sandbox Code Playgroud)
我想避免编写过于复杂的CASE WHEN语句来过滤掉 NULL,而且我对使用 PostgreSQL 的 JSON 数据类型还是个新手。在 Postgres 中构建 JSON 数组时,是否可以避免包含 NULL?
我需要对表中的所有行执行简单的更新。该表有 40-50 百万行。在此期间删除索引和约束会UPDATE导致巨大的性能改进。
但是自动吸尘器呢?autovacuum 可以启动 aVACUUM还是ANALYZE在 a 的中间UPDATE?如果是这样,那会消耗机器资源的无用工作。我可以先在桌子上禁用它UPDATE,然后再重新启用它:
ALTER TABLE my_table
SET (autovacuum_enabled = false, toast.autovacuum_enabled = false);
-- Drop constraints, drop indexes, and disable unnecessary triggers
UPDATE my_table SET ....;
-- Restore constraints, indexes, and triggers
ALTER TABLE my_table
SET (autovacuum_enabled = true, toast.autovacuum_enabled = true);
Run Code Online (Sandbox Code Playgroud)
如果我在第一个之后不提交,这甚至有效ALTER吗?
另外,如果我在禁用它UPDATE,将它触发后的更新,还是会因为它是他们中禁用它忽略这些更新?(我怀疑它会运行,但我宁愿确定。)
我现在正在使用 PG 9.3,但应该很快就会升级。因此,任何提及新版本更改的内容都值得赞赏。
我对 DB 不太好,所以请多多包涵。
我试图将一个很长的 JSON 数据放入一个表中,该表是由 Django 框架创建的。
我在 Heroku 上使用 Postgres。因此,当我尝试放置数据时,出现以下错误:
File "/app/.heroku/python/lib/python3.6/site-packages/django/db/backends/utils.py", line 64, in execute
return self.cursor.execute(sql, params)
psycopg2.OperationalError: index row size 3496 exceeds maximum 2712 for index "editor_contentmodel_content_2192f49c_uniq"
HINT: Values larger than 1/3 of a buffer page cannot be indexed.
Consider a function index of an MD5 hash of the value, or use full text indexing.
Run Code Online (Sandbox Code Playgroud)
我的数据库和表看起来像这样:
gollahalli-me-django-test::DATABASE=> \dt
List of relations
Schema | Name | Type | Owner
--------+----------------------------+-------+----------------
public | auth_group | table | …Run Code Online (Sandbox Code Playgroud) postgresql ×10
aggregate ×1
array ×1
autovacuum ×1
bulk ×1
datatypes ×1
dynamic-sql ×1
functions ×1
index ×1
json ×1
multi-tenant ×1
parameter ×1
plpgsql ×1
schema ×1
sequence ×1
trigger ×1