我编写了一个 python 脚本来在不同数据库(从 SQL Server 到 Postgres)的表之间选择和插入行。该表有大约 2000000000 行,传输停止在它中间的某个地方。我尝试选择具有偏移量的行作为已传输的行数。但是 count(*) 占用了太多的服务器资源,当我尝试时服务器变得无响应。(内存使用量在很短的时间内从 100MB 上升到 ~8GB)
我想知道是否有办法从它停止的地方提取转移。转移我目前在 Postgres 中拥有的行数大约需要 3 天时间。
谢谢。
另外,我知道大概的行数。所以也许我可以做这样的事情:如果有大约 12392320 行,删除第 12390000 行之后的所有内容,然后从 12390001 开始。这样的事情可能吗?
假设有一张表
version col_A col_B col_C
1 A1 B1 (null)
2 A2 B3 (null)
3 A3 B2 (null)
4 A5 (null) C1
5 A1 (null) (null)
Run Code Online (Sandbox Code Playgroud)
我需要的是获取 Postgres 中每列的最后一个非空值,即对于上表,我期望结果为(A1,B2,C1)。
这里的“last”是指当表按列版本排序时,每列中的最后一个非空值。
版本列始终仅包含非空值。
该表不会很大,因为只有几千行。所以,不太担心性能。
我们可以使用 来检查数组中是否包含特定值'X' = ANY(haystack)。但是,如何检查整数数组是否包含小于 X 的值?例如,我想查找至少有一个值小于 100 的所有数组。
我在阅读 PostgreSQL 文档时刚刚遇到基于表达式的索引(又名“功能索引”)(我以前不知道此类索引)。
我只是想知道 Microsoft SQL Server 中是否有与此类似/等效的内容?我已阅读有关索引的 SQL Server 文档,但没有看到任何明显相似/等效的内容。
我有一个分区表...
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
我有以下存储过程:-
-- PROCEDURE: public.master_todo(text, text)
-- DROP PROCEDURE IF EXISTS public.master_todo(text, text);
CREATE OR REPLACE PROCEDURE public.master_todo(
"actiontype" text,
"actionvalue" text)
LANGUAGE 'plpgsql'
AS $BODY$
BEGIN
IF(actiontype = 'getAllTodo') THEN
SELECT * FROM todo_list;
END IF;
END
$BODY$;
Run Code Online (Sandbox Code Playgroud)
我使用 PGAdmin 中的过程 -> 创建过程创建的。但是,在使用 EXEC 测试它时,出现错误:-
ERROR: query has no destination for result data
HINT: If you want to discard the results of a SELECT, use PERFORM instead.
CONTEXT: PL/pgSQL function master_todo(text,text) line 4 at SQL statement
SQL state: 42601
Run Code Online (Sandbox Code Playgroud)
在阅读了有关此问题的其他一些答案后,我尝试了:- …
这只是无数让我一直感到沮丧的小细节之一,迫使我记住各种特殊代码,并导致我的查询变得比应有的更难看。
尝试以下查询来获取大小:
SELECT sum(amount) FROM table WHERE conditions;
Run Code Online (Sandbox Code Playgroud)
如果它找不到sum()该数量的记录,它将返回空/空/未定义而不是 0,导致我的应用程序中的输出意外为空,而不是零的“总和”。但是sum()意味着“总和”,那么为什么不直接返回 0呢?
我知道解决方案。你“简单地”做:
SELECT COALESCE(sum(amount), 0) FROM table WHERE conditions;
Run Code Online (Sandbox Code Playgroud)
现在即使没有记录也会返回0。但它很丑,而且用起来不再感觉“有趣”。并不是说数据库应该是一个“有趣的游戏”,但你知道我的意思:如果查询变得过于复杂/“丑陋”,那么使用它就不再令人满意,特别是如果你知道这必须是在各种地方重复出现,这不仅仅是一些晦涩难懂的、一次性的边缘案例。
让它表现成这样的背后的思考过程是什么?我还有许多与 相关的其他问题null,但对于这个问题,我将重点关注这一件事。
我通过ansible生成postgresql配置文件,并将它们放入/etc/postgresql/XX/main/conf.d/whatever.conf. 我不小心犯了一个语法错误并破坏了我的 postgresql,需要手动修复。
是否有任何 postgresql 命令来验证文件是否是有效的 postgresql.conf 文件?
sudoers文件可以通过 进行验证/usr/sbin/visudo -cf path/to/file。有没有postgresql的东西?
我目前正在运行 Ubuntu 18.04 和 20.04,以及 PostgreSQL 10、12 等(是的,有几个不同的版本)。
我们计划在 RDS 上的 PostgreSQL 13.4 中使用列表/范围分区来对约 5 亿行的数据集进行分区。我们的读取访问模式应该只需要每个查询访问非常少量的分区。我们希望防止需要访问每个分区的读取查询,以便该策略可以随着数据量的增长而很好地发挥作用。是否可以在数据库层强制执行任何检查或防护,以拒绝/阻止/失败需要包含每个分区的查询计划的查询?
本质上,我希望这体现为确保子句中有足够的过滤,WHERE以便查询规划器知道它不需要路由到每个分区。我们可以检查来自业务逻辑的查询示例的查询计划,但如果能够自动执行它就更好了。理想情况下,如果开销不是太高,我们可以在生产中强制执行,但在较低的环境中执行此操作将是积极的一步。对于如何实现这一点,有什么选择或建议吗?提前谢谢了。
postgresql ×10
partitioning ×2
sql-server ×2
coalesce ×1
count ×1
deployment ×1
erd ×1
functions ×1
index ×1
null ×1
pgadmin ×1