查询语言 (SQL) 和 PL/pgSQL 函数对临时表的处理方式不同:
begin;
create table foo(id) as values (1);
select * from foo;
/*
id
----
1
*/
savepoint s;
create function f() returns setof integer language sql as $$
create temporary table foo(id) on commit drop as values (2);
select id from foo;
$$;
select * from f();
/*
f
---
1
*/
rollback to s;
create function f() returns setof integer language plpgsql as $$
begin
create temporary table foo(id) on commit drop as values …Run Code Online (Sandbox Code Playgroud) PostgreSQL 有一个属性LEAKRPOOF,你可以用它来声明一个函数,
LEAKPROOF表示该函数没有副作用。除了返回值外,它不显示有关其参数的任何信息。例如,对于某些参数值而不是其他参数值抛出错误消息的函数,或者在任何错误消息中包含参数值的函数都不是防漏的。这会影响系统对使用该security_barrier选项创建的视图或启用了行级安全性的表执行查询的方式。系统将在用户提供的包含非防漏功能的查询本身的任何条件之前强制执行安全策略和安全屏障视图中的条件,以防止数据意外暴露。标记为防漏的函数和操作符被认为是可信的,并且可以在安全策略和安全屏障视图的条件之前执行。
查询计划器在处理没有副作用的函数时具有更大的灵活性。此类函数称为
LEAKPROOF,并且包括许多简单、常用的运算符,例如许多相等运算符。查询规划器可以安全地允许在查询执行过程中的任何点评估此类函数,因为在用户不可见的行上调用它们不会泄漏有关不可见行的任何信息。此外,不接受参数或未从安全屏障视图传递任何参数的函数不必标记为LEAKPROOF被推下,因为它们永远不会从视图接收数据。相比之下,根据作为参数接收到的值可能抛出错误的函数(例如在溢出或被零除时抛出错误的函数)不是防漏的,并且可以提供关于看不见的行的重要信息如果在安全视图的行过滤器之前应用。
是下面的LEAKRPOOF函数
CREATE FUNCTION foo_leakproof(bar int)
RETURNS int AS $$
SELECT bar;
$$
IMMUTABLE LEAKPROOF
LANGUAGE sql;
Run Code Online (Sandbox Code Playgroud)
曾经有过不同的计划,或者它是否使用与LEAKPROOF缺乏替代方案不同的运行时配置文件运行,
CREATE FUNCTION foo_leaky(bar int)
RETURNS int AS $$
SELECT bar;
$$
IMMUTABLE
LANGUAGE sql;
Run Code Online (Sandbox Code Playgroud) 在CREATE ACCESS METHODPostgreSQL中的DDL上下文中,
CREATE ACCESS METHOD name
TYPE access_method_type
HANDLER handler_function
Run Code Online (Sandbox Code Playgroud)
什么是“访问方法”及其用途的高级描述?
我一直在网上寻找答案,但真的不知道如何正确地制定我想要实现的目标以及是否可能,如果问题听起来很愚蠢,请抱歉。我正在使用 Postgresql。
我每天都有价格数据。
CREATE TEMP TABLE Price (id,Day, Price) AS
VALUES
(1, 1, 40),
(2, 1, 20),
(3, 1, 50),
(4, 1, 10),
(5, 1, 20),
(6, 1, 60),
(7, 2, 10),
(8, 2, 40),
(9, 2, 10),
(10,2, 20),
(11,2, 10);
Run Code Online (Sandbox Code Playgroud)
我想根据日期和价格总和为价格数据分配数字(1、2、3...)。每当总和 > 60 时,总和计算再次开始 + 每次到达新的一天时,总和计算再次开始。例如:
第 1 行 [第 1 天,价格 40] = 1。然后对于第 2 行 [第 1 天,价格 20],价格总和为 20 + 40 < 61,因此第 2 行也被分配给 1。然后对于第 3 行 [第 1 天, price 50] 价格总和是 20 …
我现在的用户是 pronto
mediapop_staging=> select current_user;
current_user
--------------
pronto
(1 row)
Run Code Online (Sandbox Code Playgroud)
此用户是在 AWS RDS 上创建的标准超级用户。
mediapop_staging=> \du pronto
List of roles
Role name | Attributes | Member of
-----------+-------------------------------+-----------------
pronto | Create role, Create DB +| {rds_superuser}
| Password valid until infinity |
Run Code Online (Sandbox Code Playgroud)
但我得到这个:
mediapop_staging=> REASSIGN OWNED BY pronto TO mediapop_staging;
ERROR: permission denied to reassign objects
Run Code Online (Sandbox Code Playgroud)
为什么?我该如何解决?
假设我们有一个只有一个表的 Postgres 数据库。众所周知,不会在其上运行 UPDATE 语句,也不会运行任何 DELETE。它是 100% 仅附加的。
有些数据库依赖于这种行为并因此设法获得特定的性能提升,例如 Datomic。但是,这不是 Postgres 预期运行的典型方式,所以我想从性能方面受益,我需要专门配置它。
我可以利用我的无更新/删除保证的主要方式是什么?
我相信我可以完全禁用真空,但我不能 100% 确定这一点,而且我认为无论如何这都不是一个巨大的胜利。在这里可以进行的最大配置更改是什么?
如果重要的话,写入每天在特定时间发生一次,而不会在其他时间发生。但是,我认为该细节正在进入“过于本地化”的领域,因此如果没有帮助,我会将其从这个问题中删除。(如果有帮助,我会在这里编辑免责声明部分!)
我无法通过诸如psql -h *EC2ExternalIP* -U *me*. 我会得到:
psql -h *EC2ExternalIP* -U *me*
psql: could not connect to server: Operation timed out
Is the server running on host *EC2ExternalIP* and accepting
TCP/IP connections on port 5432?
Run Code Online (Sandbox Code Playgroud)
同样的事情尝试一个简单的 telnet 连接到这个端口:
curl telnet://*EC2ExternalIP*:5434
curl: (7) Failed to connect to *EC2ExternalIP* port 5434:
Operation timed out
Run Code Online (Sandbox Code Playgroud)
即使我可以在同一个EC2ExternalIP上访问其他服务(例如,apache)。
所以我在这样的线程上闲逛:
他们帮助我确保我对postgresql.conf和进行了适当的修改
pg_hba.conf;适合您的设置将取决于您的实例的安全问题。但它仍然无法正常工作。
我应该怎么做才能使这个数据库可以访问?
我创建了一个自定义类型:
CREATE TYPE my_type as(name text, street text, location text);
Run Code Online (Sandbox Code Playgroud)
初始化这样的类型很容易:
SELECT ROW('a', 'b', 'c')::my_type;
Run Code Online (Sandbox Code Playgroud)
我想知道是否有一种简单的方法可以部分初始化类型,这意味着所有未提及的列都隐式设置为 null。在伪代码中,类似于:
SELECT ROW('a', 'c')::my_type(name, location);
Run Code Online (Sandbox Code Playgroud)
另外,当列未按正确顺序提及时,是否还有一种初始化类型的方法?在伪代码中,类似于:
SELECT ROW('c', 'a', 'b')::my_type(location, name, street);
Run Code Online (Sandbox Code Playgroud) 我正在尝试在 postgres 中设置一个新的只读用户。我做了以下步骤来创建新用户:
sudo -u postgres createuser --interactive
name: read_only_user
superuser: n
create database: n
Create new roles: n
Run Code Online (Sandbox Code Playgroud)
然后我用 postgres 用户登录 postgres 并执行以下命令:
ALTER USER read_only_user WITH PASSWORD '123456';
GRANT CONNECT ON DATABASE myDB TO read_only_user;
GRANT USAGE ON SCHEMA public TO read_only_user;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only_user;
GRANT SELECT ON ALL SEQUENCES IN SCHEMA public TO read_only_user;
GRANT USAGE ON ALL SEQUENCES IN SCHEMA public TO read_only_user;
Run Code Online (Sandbox Code Playgroud)
但是如果我执行以下命令:
SELECT * FROM mytable;
Run Code Online (Sandbox Code Playgroud)
我收到以下错误: …
我正在尝试在 PostgreSQL 表中存储word/doc 嵌入的向量,并希望能够快速将具有最高余弦相似度的 N 行提取到给定的查询向量。我正在使用的向量是numpy.array长度为100 <= L <= 1000的浮点数。
我查看了相似度搜索cube模块,但它仅限于<= 100维的向量。我使用的嵌入将产生最少100 维且通常更高的向量(取决于训练 word2vec/doc2vec 模型时的设置)。
在 Postgres 中存储大维向量(numpy 浮点数组)并根据余弦相似度(或其他向量相似度度量)执行快速查找的最有效方法是什么?
postgresql ×10
functions ×2
index ×2
performance ×2
amazon-rds ×1
array ×1
aws ×1
cast ×1
datatypes ×1
dimension ×1
permissions ×1
remote ×1
sum ×1
syntax ×1
terminology ×1