我在我们的数据库中有一个非常重要的表,它被一系列应用程序使用,它附有规则、触发器和您可以想象的所有依赖项。现在我想修改表而不会对依赖项造成任何问题。我以前成功地执行了以下操作,但在一个不太复杂的情况下:
alter table reconciliations rename to matches;
create view reconciliations as select * from matches;
Run Code Online (Sandbox Code Playgroud)
这实现的是我现在可以修改新的“匹配”表,例如添加一列或多行,这些列或行不需要在“对帐”视图中显示(通过添加 where 子句来过滤它们)。
我使用的是 Postgres 9.5,因此视图可以自动更新。初步测试表明,这没有直接问题,所以我问这个问题是为了知道我应该寻找什么样的问题。性能不是大问题。
在监视我的数据库上的 autovacuum 活动时,我注意到标记为 的 autovacuum(to prevent wraparound)似乎比“常规” autovacuum 花费的时间更长。这让我开始尝试了解各种“种类”或 autovacuum 的性能/行为差异。
从文档中,我确定了 autovacuum 可能VACUUM是一张桌子的几个不同原因:
该表具有需要冻结的旧事务 ( relfrozenxid > min(autovacuum_freeze_max_age, table.autovacuum_freeze_max_age)。这就是“ (to prevent wraparound)”自动真空。
自上次以来表中过时的元组数VACUUM超过“真空阈值”
还有其他我想念的吗?
手册VACUUM中似乎暴露的“攻击性”旋钮是FREEZE和DISABLE_PAGE_SKIPPING。这些不同类型的 autovacuum 是否曾经使用过这些选项,如果是,什么时候使用?
我希望将一个表中的日期与另一个表中具有不同频率的日期对齐。我希望与低频表相关联的值在出现新日期之前重复,以便我可以对涉及两个表的数据进行计算。
为了促进这一点,我认为构建索引范围方案会很有用且更快。
这可能会更清楚...
让我们称之为daily表:
CREATE TEMP TABLE daily AS
SELECT date::date, val FROM ( VALUES
('2017-01-01',1),
('2017-01-02',2),
('2017-01-03',1),
('2017-01-04',56),
('2017-01-05',7),
('2017-01-06',6),
('2017-01-07',8),
('2017-01-08',6),
('2017-01-09',4),
('2017-01-10',4),
('2017-01-11',6),
('2017-01-12',8)
) AS t(date,val);
Run Code Online (Sandbox Code Playgroud)
这是low_fq(低频)表:
CREATE TEMP TABLE lowfq AS
SELECT date::date, val FROM ( VALUES
( '2017-01-02',700 ),
( '2017-01-06',100 ),
( '2017-01-08',200 ),
( '2017-01-12',500 )
) AS t(date,val);
Run Code Online (Sandbox Code Playgroud)
结果应该是这样的:
?????????????????????????????????????????????????????????????
? dialy ? ? ? low_fq ? ? ? low_fg/daily ?
?????????????????????????????????????????????????????????????
? date ? val ? …Run Code Online (Sandbox Code Playgroud) 我需要在每行的数组中存储一个 id 列表。我想使用 JSONB,然后将其存储为 : {ids: [1, 2, 3, 4]}。然后,我找到了Array类型,我可以用它直接将 id 存储到其中。问题是,我的案例推荐的数据类型是什么?
只是想知道是否有可用于 PostgreSQL 的扩展的官方列表?
我有一个表,其中一fk列应该是唯一的,当另一int列是> 0. 如果这句话没有意义,以下是有效行的示例:
CREATE TABLE foo
AS
SELECT fk,int
FROM ( VALUES
( 1, -12 ),
( 1, 20 ),
( 1, 0 )
) AS (fk, int);
Run Code Online (Sandbox Code Playgroud)
向表中添加一个fk值为 的新行1和一int列是> 0无效的。
有没有办法用约束或索引来做到这一点?我觉得排除约束几乎让我到达那里,但我无法找到让它工作的方法。
我正在使用 Postgres 9.6.2。
我正在使用脚本和 psql 运行多个查询。我还使用 COPY TO 命令将结果导出到 a.csv。但是,当我想将结果附加到 a.csv 时,这会覆盖文件 a.csv。
是否可以使用 COPY TO 语法,也许我缺少一些参数?还是我应该考虑使用其他工具?
相反:在创建新表时获取所有列是否更好?
我正在开发一个新系统,而且新的要求一直在出现。最新的要求是为每个客户添加一个新的标签字段,以便更容易在新旧系统之间关联数据。新系统尚未投入生产,但已经完成了迁移过程的一些测试运行。
目前,删除表并重新运行批量加载仍然可行,但未来如何 - 当系统中有大量实时数据并且出现对新列的需求时:它对例如,要导出数据,重新创建包含所有列的表,然后再次导入数据,而不仅仅是执行 ALTER TABLE ADD 列......?
如果它有任何不同,该解决方案基于 PostgreSQL 9.5,如果它确实有所不同,那么了解哪些 DBMS 或多或少关心会很有趣。
是否在此列上创建索引会影响答案?例如,当设置了唯一约束时。
我在 Postgres 中使用||运算符连接一些列运行查询,似乎其中一列为空,整个结果为空。这是正常||行为吗?
我的意思是“空白” NULL。
Oracle 允许主键具有重复值和空值。使用此功能并不是一个特别好的主意,但它意味着大多数开发人员认为主键的某些保证(非空、唯一)并不是真正的保证。
CREATE TABLE oracle_guarantees (
ID NUMBER(9,0),
NAME VARCHAR2(50 BYTE),
breed NVARCHAR2(100)
);
INSERT INTO oracle_guarantees VALUES (1, 'Fuzz Head', 'Tabby');
INSERT INTO oracle_guarantees VALUES (2, 'Fluffy Thing', 'Mix');
INSERT INTO oracle_guarantees VALUES (2, 'Fluffy Thing', 'Mix');
INSERT INTO oracle_guarantees VALUES (3, 'Tiger', 'Tabby');
INSERT INTO oracle_guarantees VALUES (4, 'Fur Beast', 'Bengal');
INSERT INTO oracle_guarantees VALUES (5, 'Karate', 'Japanese Bobtail');
INSERT INTO oracle_guarantees VALUES (6, 'Chairman Meow', 'Chinese Harlequin');
INSERT INTO oracle_guarantees VALUES (NULL, 'No Cat', 'No breed');
CREATE …Run Code Online (Sandbox Code Playgroud) postgresql ×10
alter-table ×1
autovacuum ×1
constraint ×1
export ×1
migration ×1
operator ×1
oracle ×1
psql ×1
sql-server ×1
sqlite ×1
timestamp ×1
view ×1