如果我有一个数百万行的表,并且运行一个更新 50k 行的事务,那么这会对性能产生什么影响?
假设它的索引正确,应该不会花很长时间,但是哪些行被锁定以及该表的使用如何受到影响?
我的问题是针对 Postgres 9.3 的;我认为存在差异。
在 Postgres 中,我正在考虑查询pg_type我经常使用的最新枚举列表。我会使用这样的东西:
SELECT pg_type.typname AS enum_type, pg_enum.enumlabel AS enmu_label FROM
pg_type JOIN pg_enum ON pg_enum.enumtypid = pg_type.oid;
Run Code Online (Sandbox Code Playgroud)
或者
SELECT distinct pg_type.typname AS enum_type FROM pg_type JOIN pg_enum ON
pg_enum.enumtypid = pg_type.oid;
Run Code Online (Sandbox Code Playgroud)
这是不好的做法吗?
据我了解,在 Postgres 中,过程用于操作数据,函数用于读取数据。我想要:
CREATE PROCEDURE test_variable()
LANGUAGE SQL
AS $$
BEGIN;
DECLARE some_id INTEGER;
SELECT nextval('some_sequence') INTO some_id;
INSERT INTO some_table (some_column) VALUES (some_id);
END;
$$;
Run Code Online (Sandbox Code Playgroud)
以上对我不起作用。当我寻找解决方案时,有很多不同的变量涉及函数$$、声明、事物不返回任何内容;似乎找不到一个简单的例子;我只需要一个清晰的语法示例。
为了便于论证,我有一个简单的表格。我有一个选择 ids 并循环它们的函数,称为loop_test. 我可以选择一个 id 数组并循环它们,从而导致我在事务中进行更改。
CREATE OR REPLACE FUNCTION loop_test() RETURNS void AS $$
DECLARE
_ids_array INTEGER[];
_id INTEGER;
BEGIN
SELECT ARRAY(SELECT id FROM loop_test) INTO _ids_array;
FOREACH _id IN ARRAY _ids_array
LOOP
UPDATE loop_test SET looped = TRUE WHERE id = _id;
END LOOP;
END;
$$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)
桌子:
db=# \d loop_test;
Table "public.loop_test"
Column | Type | Modifiers
---------------+---------+-----------
id | integer |
other_id | integer |
id_copy | integer |
other_id_copy | integer | …Run Code Online (Sandbox Code Playgroud) postgresql ×4
aggregate ×1
array ×1
catalogs ×1
concurrency ×1
enum ×1
functions ×1
plpgsql ×1
transaction ×1