Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql “更新作业”时,您可能需要考虑将事务隔离级别切换为“Read ItRead”,以防止Ghost读取。_Postgresql - Fatal编程技术网

Postgresql “更新作业”时,您可能需要考虑将事务隔离级别切换为“Read ItRead”,以防止Ghost读取。

Postgresql “更新作业”时,您可能需要考虑将事务隔离级别切换为“Read ItRead”,以防止Ghost读取。,postgresql,Postgresql,关于第3个查询,您可以尝试使用基于type\u id的分区方法。但是,我觉得您的查询有点奇怪,因为您正在执行限制/偏移,而没有指定(注意:您并不是说您将使用数据库游标)的顺序(例如,没有ORDER BY语句)。如果在表上启用分区,这可能会导致更改当前使用的隐式顺序。因此,请注意这可能会对您的程序造成的副作用。 还有一件事:在真正进行分区拆分之前,我会首先通过发出 select type_id, count(*) from transactions group by type_id 但事实并非如

关于第3个查询,您可以尝试使用基于
type\u id
的分区方法。但是,我觉得您的查询有点奇怪,因为您正在执行
限制
/
偏移
,而没有指定(注意:您并不是说您将使用数据库游标)的顺序(例如,没有
ORDER BY
语句)。如果在表上启用分区,这可能会导致更改当前使用的隐式顺序。因此,请注意这可能会对您的程序造成的副作用。 还有一件事:在真正进行分区拆分之前,我会首先通过发出

select type_id, count(*) from transactions group by type_id
但事实并非如此,例如,您90%的数据都与
卡式支付有关
——因此,您的分区之间的分布极不均匀,最大的性能占用查询是那些仍会进入这个“大分区”的查询


希望这有点帮助-祝你好运

如果查询3和查询4是最常见的,我们应该尝试优化它们的分区。他们的
其中
条件包括三列
账户id
类型id
发布日期
account\u id
的选择性非常高,因此它很可能更适合索引
date\u-issued
与非相等运算符一起使用,因此分区没有多大帮助
type_id
没有选择性,因此可以确定,但不用于查询4。==>没有明显的解决方案(至少对我来说)。请注意,您所指的是Postgresql 10的文档,而您的服务器位于9.6。选项2:由于查询4不包含
年份
(或
年份
),这也没有多大帮助。无论如何,查询3不限于w.r.t.
发布日期
,因此这也不是最佳解决方案。我目前正在考虑物化视图的方向(例如,处理聚合查询4)@Luke1988:查询4中
jrn.transactions
的更新/插入频率是多少?以及
sum(amount)
的准确性有多重要?是的,因为它们是最重要的外键。结合其中一个日期字段,它们几乎构成了表的自然键。谢谢!据我所知,分区不会有帮助,因为帐户id?如果没有account\u id列(现在只是理论上的),那么按类型\u id进行分区会有意义吗?我可能会重定向查询3。直接到此分区-
从jrn.transactions\u cash\u drawing LIMIT 100中选择*是,如果您按
类型\u id
分区,它将只扫描该分区。但是,如果您有适当的索引并使用索引扫描,这不会比在大表上便宜多少。分区仅对使用顺序扫描和批量删除的计划有帮助。感谢您的努力!我运行了这个查询。数据分布几乎相等,每种类型约为5%到10%。一种使用很少,两种使用更频繁,但不超过20%。关于事务聚合的糟糕想法是,查询是由应用层生成的,目前,对应用程序的任何修改都是有问题的,不在我们手中。关于查询顺序:我们使用隐式顺序,因为我们在事务进入系统时列出它们,所以自然的主键顺序可以很好地工作。
CREATE INDEX ON jrn.transactions (account_id, date_issued);
CREATE INDEX ON jrn.transactions (refund_id);
CREATE INDEX ON jrn.transactions (account_id, type_id);
create table transactions_aggr (
   account_id INT NOT NULL,
   date_issued DATE,
   sumamount NUMERIC,
   primary key (account_id, date_issued)
)
select account_id, date_issued, sum(amount) as sumamount from
    (
    select account_id, date_issued, sumamount as amount from transactions_aggr as aggr
    union all
    select account_id, date_issued, sum(amount) as amount from transactions as t where t.aggregated = false
    )
group by account_id, date_issued
select type_id, count(*) from transactions group by type_id