我在 Java 中有一个 Web 应用程序,它使用查询。我不想把查询写成Java,所以我做了一个函数:
CREATE OR REPLACE FUNCTION testFunc(inputs text) RETURNS TABLE(...) AS
$$
SELECT .... FROM ...
JOIN ...
where true
;
$$
LANGUAGE SQL;
Run Code Online (Sandbox Code Playgroud)
我希望函数参数 INPUTS 也位于 WHERE 子句中,因此如果输入是
AND speed = 0 AND ....
Run Code Online (Sandbox Code Playgroud)
Where 子句看起来像
where true AND speed = 0 AND ...
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
编辑
也可以接受许多参数(a int、b string、c string ..)但是我需要有
WHERE speed = * AND stop = * AND ...
Run Code Online (Sandbox Code Playgroud)
这是不可接受的。我怎样才能做到这一点?
或者我可以在里面放一个 if 语句吗?喜欢
Select .. . from ...
JOIN ...
WHERE true
IF (a …Run Code Online (Sandbox Code Playgroud) 我有一个文章表,我希望 slug 是独一无二的。
CREATE TABLE article (
title char(50) NOT NULL,
slug char(50) NOT NULL
);
Run Code Online (Sandbox Code Playgroud)
当用户输入标题时,例如News on Apple,我想检查数据库以查看是否存在相应的 slug,例如news-on-apple。如果是这样,我将给一个数值添加后缀,直到找到一个唯一的值,例如news-on-apple-1. 可以通过递归 CTE 查询而不是在我的 ORM 中进行递归来实现。是否有一个很好的大概数字,我应该停止递归和出错。我可以想象人们使用相同的标题 1000 次,这将导致 1000 次查询只是为了创建 1 篇文章。
我对递归 CTE 的理解可能是不正确的,并且没有更好的方法来找到唯一的 slug。请提出任何替代方案。
我有超过 10 年的时间序列数据,有超过 3 万亿行和 10 列。
目前我使用具有 128GB RAM 的 PCIe SSD,我发现查询需要大量时间。例如,运行以下命令需要超过 15 分钟:
SELECT * FROM tbl WHERE column_a = 'value1' AND column_b = 'value2';
Run Code Online (Sandbox Code Playgroud)
该表主要用于读取。写入表的唯一时间是在每周更新期间插入大约 1500 万行。
管理如此大的表的最佳方法是什么?您会建议按年份拆分吗?
表大小为 542 GB,外部大小为 109 GB。
EXPLAIN (BUFFERS, ANALYZE) 输出:
"Seq Scan on table (cost=0.00..116820941.44 rows=758 width=92) (actual time=0.011..1100643.844 rows=667 loops=1)"
" Filter: (("COLUMN_A" = 'Value1'::text) AND ("COLUMN_B" = 'Value2'::text))"
" Rows Removed by Filter: 4121893840"
" Buffers: shared hit=2 read=56640470 dirtied=476248 written=476216"
"Total runtime: 1100643.967 ms"
Run Code Online (Sandbox Code Playgroud)
该表是使用以下代码创建的:
CREATE TABLE …Run Code Online (Sandbox Code Playgroud) postgresql index database-design database-recommendation partitioning
我们正在运行 Postgres 9.3,偶尔会出现死锁问题。目前有人注意到并将手动终止进程。当它们发生时,是否有处理这些问题的最佳实践?我知道有一个statement_timeout,lock_timeout而deadlock_timeout但大多数地方,我读状态,你不想设置此的postgres.conf文件。
只是想看看是否有典型/最佳实践方法。看起来将 deadlock_timeout 设置为 10 分钟就足够了,但我想确保我没有遗漏一些关键的东西,为什么这会是一个坏主意。
我在 PostgreSQL 9.5 中编写了一个 PL/pgSQL 函数。它编译得很好,但是当我从 pgAdmin3 调用它时,它给了我一个错误。似乎用函数中传递的参数替换列的动态查询不起作用。
下面是我的功能:
CREATE OR REPLACE FUNCTION insertRecordsForNotification(username text, state text, district text, organizationId text, bloodGroup text, status text, approveRejectStatus text, emailSubject text, emailBody text, notificationStatus text) RETURNS boolean AS $$
DECLARE
id int;
r moyadev.user%rowtype;
_where text :=
concat_ws(' AND '
, CASE WHEN state IS NOT NULL THEN 'state = $2' END
, CASE WHEN district IS NOT NULL THEN 'district = $3' END
, CASE WHEN bloodGroup IS NOT NULL THEN …Run Code Online (Sandbox Code Playgroud) 我正在尝试在 Postgres 中创建一个函数,该函数可以遍历给定jsonb对象中的每个键/值对。
create or replace function myFunction
(input jsonb)
returns jsonb as $$
BEGIN
// foreach(key in input)
// do some math operation on its corresponding value
returns input;
END; $$
Run Code Online (Sandbox Code Playgroud)
参数输入应为 jsonb 对象,例如{"a":1, "b":2, "c":3}.
我想遍历对象中的每个键/值对。从我的评论中可以看出,我曾经使用更通用的编程语言(如 c、java 等)编写后端代码。所以我不擅长 SQL。我曾尝试在线搜索,但他们谈论如何遍历jsonb数组而不是对象。所以真的卡在这里了。
psql 13.2 退出编辑器时,无论退出编辑器后如何,都会执行查询缓冲区 - 在这种情况下,缓冲区现在可能保存最近执行的 SQL 查询。
重现:
vim使用\e或\e filename从psql控制台启动编辑器(在我的情况下)。:q(或:q!强制)预期行为:回到启动编辑器之前的状态。(我取消了编辑!)
观察到的行为:重新执行上次执行的 SQL 查询。
似乎发生了什么\e:
它执行(相当于)\p,因此当前查询缓冲区包含前一个命令,当它为空时。(编辑文件时用户看不到!)
手册\p :
\p或者将当前查询缓冲区打印到标准输出。如果当前查询缓冲区为空,则打印最近执行的查询。
启动编辑器。如果提供了文件名,则加载文件,否则加载查询缓冲区。
如果编辑器以写入结束,则将结果复制到查询缓冲区。
如果编辑被取消(:q在 vim 中),不要覆盖查询缓冲区。(它现在保存了之前的命令!)
执行查询缓冲区。或者,准确地说,这样做:
行为似乎可以\p(只是复制查询缓冲区,没有造成任何伤害),但不能\e执行,它可以执行我什至没有看到的命令。
这是一个错误吗?
无论哪种方式,我至少想在离开编辑器时禁用自动执行。但这似乎不可能。或者我错过了什么?
使用 Postgres 9.x 与 MySQL 5.x 存储EAV(实体-属性-值)结构有什么实际区别,或者有什么优势,尤其是在读取性能方面?
我正在使用 PostgreSQL 热备份运行测试,有 1 个主站,正好有 1 个从站。
我正在使用本指南中的说明:http : //www.howtoforge.com/how-to-set-up-a-postgresql-9.0-hot-standby-streaming-replication-server-with-repmgr-on-opensuse -11.4
我使用的是 PostgreSQL 9.1 版、repmgr 1.1.0 和 Ubuntu 10.04 LTS。
我按照我跑的指南中的步骤进行了步骤 6
repmgr -D /var/lib/postgresql/9.1/main -d pgbench -p 5432 -R postgres --verbose standby clone pgmaster
Run Code Online (Sandbox Code Playgroud)
在 pgslave 上。
然后我做了一个
/etc/init.d/postgresql start
Run Code Online (Sandbox Code Playgroud)
在它上面,脚本(似乎)成功完成。
但是,执行 psql 会引发错误:
psql: FATAL: 数据库系统正在启动
欢迎任何有关进一步进行的帮助。
有没有办法在 Postgres 9.3.9 中记录单个连接或用户或客户端主机的所有 SQL 查询?
换句话说,我log_statement = all只想要某个用户名或客户端主机名或客户端 IP 或连接 ID。
一种选择是记录所有客户端的 SQL 活动并搜索日志。我希望有更好的方法。
postgresql ×10
dynamic-sql ×2
plpgsql ×2
cte ×1
deadlock ×1
eav ×1
functions ×1
index ×1
java ×1
json ×1
locking ×1
log ×1
mysql-5 ×1
parameter ×1
partitioning ×1
performance ×1
psql ×1
recursive ×1
replication ×1
repmgr ×1