在Microsoft SQL Server中,可以指定"重音不敏感"排序规则(对于数据库,表或列),这意味着可以进行类似的查询
SELECT * FROM users WHERE name LIKE 'João'
Run Code Online (Sandbox Code Playgroud)
找到一个带有Joao名字的行.
我知道可以使用unaccent_string contrib函数从PostgreSQL中删除字符串中的重音符号,但我想知道PostgreSQL是否支持这些"重音不敏感"排序规则,以便SELECT上述方法可行.
我继承了一个充满数据的现有Postgres数据库.大多数数据都有'created_date'列值.在跟踪之前插入了一些早期数据.
有一个Postgres元数据表隐藏在跟踪INSERT查询完成时的某个地方吗?
有没有办法为表记录生成某种有序标识符?
假设我们有两个线程在进行查询:
线程1:
begin;
insert into table1(id, value) values (nextval('table1_seq'), 'hello');
commit;
Run Code Online (Sandbox Code Playgroud)
线程2:
begin;
insert into table1(id, value) values (nextval('table1_seq'), 'world');
commit;
Run Code Online (Sandbox Code Playgroud)
完全可能(取决于时间)外部观察者会看到(2,'世界')记录出现在(1,'你好')之前.
这很好,但是我想要一种方法来获取自上次外部观察者检查它以来出现的'table1'中的所有记录.
那么,有没有办法按照插入的顺序获取记录?也许OID可以提供帮助?
我们编写了一个get_timestamp()定义为的函数
CREATE OR REPLACE FUNCTION get_timestamp()
RETURNS integer AS
$$
SELECT (FLOOR(EXTRACT(EPOCH FROM clock_timestamp()) * 10) - 13885344000)::int;
$$
LANGUAGE SQL;
Run Code Online (Sandbox Code Playgroud)
这在INSERT和UPDATE上用于输入或编辑数据库记录中已创建和已修改字段中的值.但是,我们发现连续添加或更新记录时它返回的值相同.
在检查pgAdmin III中的函数时,我们注意到在运行SQL来构建函数时,在LANGUAGE SQL语句之后注入了关键字IMMUTABLE.该文件指出默认是挥发性的(如果一个都没有出现,VOLATILE是默认的假设),所以我不知道为什么IMMUTABLE注射,然而,改变这种稳定解决了重复值的问题.
注意:如接受的答案中所述,IMMUTABLE永远不会被pgAdmin或Postgres添加到函数中,并且必须在开发期间添加.
我猜测正在发生的事情是这个函数正在被评估并且结果被缓存用于优化,因为它被标记为IMMUTABLE指示Postgres引擎在给定相同(空)参数列表的情况下返回值不应该改变.但是,当在触发器中未使用时,直接在INSERT语句中使用时,该函数将返回一个不同的值五次,然后再返回相同的值.这是由于某些优化算法会出现类似"如果在会话中多次使用IMMUTABLE函数5次,请将结果缓存以供将来调用"?
关于如何在Postgres函数中使用这些关键字的任何说明将不胜感激.对于我们来说STABLE是正确的选择,因为我们在触发器中使用了这个函数,或者还有更多要考虑的东西,例如文档说:
(对于希望查询当前命令修改的行的AFTER触发器不合适.)
但我并不清楚原因.
我的团队需要一个串行列来随着每次提交单调增加.
有些情况下,两笔交易获得值的情况下100,并101从序列,那么100交易需要更长的时间来提交,所以价值101首先得到承诺,其次是100.这种情况对我们的需求是有问题的,我们需要解决它.
这正是这个问题所描述的问题.我们需要一个不需要更改数据库配置的解决方案,这与该问题的已接受答案不同.
对该解决方案的评论以及本文建议使用在获取值之前开始的独占事务咨询锁.
有没有办法让Postgres自动获取此锁并在序列到达INSERT相关表时从序列中获取值?
注意:提交的值中的间隙是可以预期的.
编辑:我已经深入研究这个问题,能够很好地问它,但我对Postgres不是很有经验.我希望指向特定触发器的指针或任何特定的PG设置将实现此目的.
我正在设计一个并发安全的增量聚合汇总系统,track_commit_timestamp (pg_xact_commit_timestamp) 听起来很完美。但是我发现很少有关于它的评论,并且无法从源代码中弄清楚它是如何工作的。
希望有人知道我的一个或多个问题的答案:
提交时间戳功能是否有可能产生乱序时间?我所追求的是一种识别自特定时间以来已更改的记录的方法,以便我可以获取任何以后的更改以进行处理。如果有相同的时间戳,我不需要它们以完美的提交顺序。
最终实现中每行添加多少字节?我看到的讨论似乎在 12-24 个字节之间。曾讨论过为“以防万一”添加额外字节。这是 9.5 之前的版本,所以是一个世界之前的版本。
时间戳是否在内部编入索引?用 B 树?我询问容量规划的原因。
我在 StackOverflow 和设计讨论中看到时间戳不是无限期保留的,但无法找到它们存储时间的详细信息。
关于启用 track_commit_timestamp 的性能影响的任何经验法则?我不需要所有表上的数据,但是,在我需要的地方,听起来它可能工作得很好。
有什么问题吗?我尝试在测试表上运行 VACUUM FULL 并且 pg_xact_commit_timestamp 都没有改变。看起来像 VACUUM 这样的物理操作不应该改变任何东西,但很容易有一些我没有想到的东西。而且,老实说,我的快速 VACUUM 测试甚至可能没有任何意义。
非常感谢您的帮助!
我编辑了我的问题以阐明我要完成的任务,我希望根据更新标记跟踪已处理和未处理的数据。
select max(pg_xact_commit_timestamp(xmin)) from scan;-- 2019-07-07 20:46:14.694288+10
update scan set quantity = 5 where quantity = 1; -- Change some data.
select max(pg_xact_commit_timestamp(xmin)) from scan; -- 2019-07-10 09:38:17.920294+10
-- Find the changed row(s):
select *
from scan
where pg_xact_commit_timestamp(xmin) > '2019-07-07 20:46:14.694288+10';
Run Code Online (Sandbox Code Playgroud)
这个想法是对行进行增量和定期汇总。所以,
-- 跟踪上次汇总的时间戳。-- 等待 5 分钟(或其他时间)。 -- 查找当前的最大提交时间戳。-- …
postgresql ×6
transactions ×2
database ×1
function ×1
indexing ×1
localization ×1
locking ×1
rollup ×1
sequence ×1
sql ×1
timestamp ×1
volatility ×1