我有一个 SSD,使用 IOmeter 测试,显示性能超过 200MB/s。但是,当我从本地机器运行任何 SQL 查询时,Windows 资源监视器永远不会显示超过 7MB/秒的磁盘 IO。即使对于运行时间超过 2 分钟的查询也是如此。瓶颈是什么,它仅使用 SSD 的 7MB/秒?
我在跑:
我有一个大约有 100M 行的表。它每天只插入一次数据,但我们需要做select很多事情。该selects为通常比较简单,但需要有时返回几千行的100S。
它基于三列node_id,是唯一的pricedate,hour分别是整数、时间戳、整数。大多数查询都很慢,但我将它聚集到node_id,pricedate这解决了大多数查询的缓慢问题。这些查询属于以下类型:
select * from mytable where node_id in (1,2,3,4)
Run Code Online (Sandbox Code Playgroud)
我们仍然偶尔需要做这样的查询:
select * from mytable where pricedate>='2016-05-01'
Run Code Online (Sandbox Code Playgroud)
这些仍然很慢,因为它是由node_id第一个聚集的。我们已经有了一个索引pricedate。问题是用户通常需要足够的数据,查询引擎会抛出索引并使用 seq 扫描。一旦它使用了 seq 扫描,它就会从以查询方式对数据进行聚类中受益匪浅。这导致了我遇到的问题,其中一些查询从一个聚类中受益,而其他查询从另一个中受益:
如果有一种方法可以拥有表的两个物理副本,其中一个副本以一种方式聚集,另一个以另一种方式聚集,但用户对它的访问似乎只有一张表,并且数据库引擎将确保它们是同步的。显然,这样做会受到写入处罚,但这对我们的使用来说无关紧要。
这样的事情可能吗?
我猜没有一种内置的方式来做我所描述的。无论如何,我想我会mytable_dup使用相同的唯一键约束调用一个表,但使用备用集群,然后设置触发器在插入/更新/删除主服务器时插入它。这似乎可行,但从这里开始,是否有一种合理的方法select可以有效地从复制表中提取?
我在家里运行 PostgreSQL 9.4,在 Google 上运行 9.5。
我有一个接近填满它所在硬盘的数据库。我想将数据库扩展到另一个硬盘来处理这个问题。
我看到 SSMS 下的数据库属性中有一个文件选项,我可以添加它,但我真的不想在不知道接下来会发生什么的情况下添加文件。我是否需要在文件组中添加一个新条目,然后再添加到文件中?PRIMARY 类型是否只应该用于第一个文件?如果不是,那么制作一个小学和另一个中学有什么区别?添加文件后,数据库引擎是自动决定将数据放在哪里还是我必须进入我的表并以某种方式指定它?
对不起,如果这是重复的。如果不是,我会感到惊讶,但我找不到其他有这些答案的问题。
我正在运行 postgres 9.4 DB 的 pg_dump,如果其他进程在表上具有独占锁,它偶尔会遇到错误。有没有办法让 pg_dump 忽略该表并继续处理数据库的其余部分,而不是仅仅停下来?
我有一个分区表...
CREATE TABLE erco.rtprices
(
scedtime timestamp with time zone NOT NULL,
node_id integer NOT NULL,
lmp numeric(12,6),
CONSTRAINT rtprices_pkey PRIMARY KEY (scedtime, node_id)
) PARTITION BY LIST (node_id);
Run Code Online (Sandbox Code Playgroud)
每个都有node_id自己的分区。
如果我进行直接查询(第一个版本),例如:
explain select scedtime, lmp
from erco.rtprices
where node_id = 11111
Run Code Online (Sandbox Code Playgroud)
然后该计划仅对rtprices_11111分区进行顺序扫描。 这就是我要的。
但是,如果我执行(第二个版本)查询,例如
explain select scedtime, lmp
from erco.rtprices
inner join erco.nodes using (node_id)
where nodename = 'somename'
Run Code Online (Sandbox Code Playgroud)
那么该计划包括对每个分区进行顺序扫描,即使此查询与第一个查询一样有限制。
我尝试了上述查询的另一种形式(第三个版本)。
explain select scedtime, lmp
from erco.rtprices
where node_id = (select node_id from erco.nodes where nodename='somename') …Run Code Online (Sandbox Code Playgroud) postgresql execution-plan partitioning postgresql-performance postgresql-13
我有一个表,我想从中删除很多行,但由于内存限制而失败。我看到一个建议“简单地”将我不想删除的所有行复制到新表中,删除旧表,然后将新表重命名为旧表的名称。除了依赖于原始表的其他对象之外,这很好。据我所知,这意味着我必须放弃级联,然后重新创建依赖于原始表的所有内容。
有没有办法编写依赖于原始表的所有内容的脚本,以便我可以轻松地在 pgadmin 或 psql 中重新创建它们?
或者,是否有办法忽略依赖关系足够长的时间来删除旧表并将新表重命名为旧表的名称?
我相信这就是 pg_repack 的工作原理,所以一定有办法。