在这个答案中,Erwin Brandstetter 说:
count(step OR NULL) OVER (ORDER BY date)是最短的语法,也适用于 Postgres 9.3 或更早版本。count()只计算非空值。在现代 Postgres 中,更简洁、等效的语法是:Run Code Online (Sandbox Code Playgroud)count(step) FILTER (WHERE step) OVER (ORDER BY date)
我不确定为什么count(step OR NULL)是首选。在我的查询中,我执行以下操作。我重命名了我的变量以匹配他的同时保持语法。
CASE WHEN lag(id_type) OVER (ORDER BY date) <> id_type THEN 1 END AS step
Run Code Online (Sandbox Code Playgroud)
我们正在计算它返回的值。请注意,case 只能返回 1 或 null。
欧文的回答是:
这假设涉及的列是
NOT NULL. 否则你需要做更多。
所以我更迷茫了。添加count(step OR NULL)什么来保护我们的查询有什么意义?
任何人都可以分解这一点,也许可以展示两个带有数据的示例,其中只有一个 - 一个 -count(x OR NULL)有效?
我有一个文本表和双精度类型。从中,我想构建一个如下所示的 JSON 对象:({"a": 1.0, "b": 1.2, "c": 3.4}编辑:澄清一下,键是表中的文本列,值是双精度列)。请注意,值周围没有引号,因为它们是浮点数,而不是 JSON 标准支持的字符串。
使用 Postgres 9.5。有一个json_build_object函数需要两个并行的文本数组并构建一个带有文本键和文本值的 JSON 对象......也适用于 NULL 值,null在 JSON 中将它们转换为(无引号)。所以我会得到{"a": "1.0", "b": "1.2", "c": "3.4"}。但是如果我想要整数或浮点值怎么办?它不会采用任何数字类型数组。
我现在通过创建自己的函数在 Python 中处理它来解决这个问题!有没有办法在不定义新函数的情况下做到这一点?
CREATE OR REPLACE FUNCTION json_build_object_float_values(keys TEXT[], vals DOUBLE PRECISION[]) RETURNS JSONB AS
$$
assert len(keys) == len(vals)
import json
d = {}
for i in range(len(keys)):
d[keys[i]] = float(vals[i])
return json.dumps(d)
$$
LANGUAGE 'plpython3u' IMMUTABLE;
Run Code Online (Sandbox Code Playgroud)
(请注意,如果您使用它,它会返回 JSONB,但您可以将其更改为 JSON)
编辑,这里是测试输入和预期输出:
CREATE TABLE test (str text, num …Run Code Online (Sandbox Code Playgroud) 每当我访问 psql 时,都会收到以下消息:
psql (9.6.2)
WARNING: Console code page (437) differs from Windows code page (1252)
8-bit characters might not work correctly. See psql reference
page "Notes for Windows users" for details.
Type "help" for help.
postgres=#
Run Code Online (Sandbox Code Playgroud)
我试过命令
cmd.exe /c chcp 1252
Run Code Online (Sandbox Code Playgroud)
在命令行中运行 runpsql.bat 文件之前。在那里,它运行良好,没有错误。但是在关闭命令提示符后再次访问 psql 会引发相同的警告。如何在 SQL Shell 中解决此警告?
我正在使用 Windows 10 操作系统。
编辑:
这就是我所做的:
Microsoft Windows [Version 10.0.10586]
(c) 2015 Microsoft Corporation. All rights reserved.
C:\Users\Sarthak Joshi>E:
E:\>cd PostgreSQL
E:\PostgreSQL>cd scripts
E:\PostgreSQL\scripts>chcp 1252
Active code page: 1252
E:\PostgreSQL\scripts>runpsql.bat …Run Code Online (Sandbox Code Playgroud) 我有这个 Postgres 9.6 表定义:
CREATE TABLE research (
id int,
data jsonb
);
Run Code Online (Sandbox Code Playgroud)
并在其中包含以下示例数据
id |data
---|--------------------------------------------------------
1 |{"name": "Sim Ltd", "sector": "business", "personnel": {"headcount": {"total": 100, "male": 50, "female": 50}}}
2 |{"name": "EcoSmart", "sector": "business", "personnel": {"headcount": {"total": 500, "male": 460, "female": 40}}}
3 |{"name": "HIDN", "sector": "government", "personnel": {"headcount": {"total": 431, "male": 121, "female": 310}}}
4 |{"name": "RevDev", "sector": "government", "personnel": {"headcount": {"total": 15, "male": 10, "female": 5}}}
5 |{"name": "NEFPAN", "sector": "non-profit", "personnel": {"headcount": {"total": 5, "male": …Run Code Online (Sandbox Code Playgroud) 我已经更新了我pg_hba.conf的主人。
host loko replicator 10.0.2.15/32 trust
Run Code Online (Sandbox Code Playgroud)
我确实重新加载了配置。然后我用这个命令创建了一个用户
CREATE USER replicator REPLICATION LOGIN ENCRYPTED PASSWORD 'repl'
Run Code Online (Sandbox Code Playgroud)
loko这是我的主人和replicator用户的数据库。
并在从站上运行此命令
pg_basebackup -h x.x.x.x -D "C:\Program Files\PostgreSQL\9.4\data" -U
replicator -v -P --write-recovery-conf -X stream
Run Code Online (Sandbox Code Playgroud)
结果是
no pg_hba.conf entry for replication connection from host x.x.x.x. user replicator, SSL off
Run Code Online (Sandbox Code Playgroud)
非常感谢您的帮助。我是新手,所以我不知道这有什么问题。我只是跟着教程。
是涵盖非唯一索引/指数ç在onsistency条款Ç ID?(对于不限制数据的索引的其他属性也是如此)我在 Postgres 中看到了某些性能问题(实际上是好处),这让我想知道它们是否存在。
鉴于索引/索引不是一流的对象(即您不能直接在 Postgres 中访问它们,也不能请求使用它们),我完全看不出为什么需要 Postgres 来支持这一点。我找不到 ACID 的定义说“索引必须完全完成并且在事务完成之前不能被黑客攻击”。
在某些不对插入设置限制的条件下(例如索引不是唯一的),索引本质上可能是“无效的”(即“在我完成重新索引之前不要使用它”),或者标志可以是设置表示“该索引不涵盖以下范围”。
如果 Postgres 使用这个技巧,copy from操作符可以变得非常迅速(这就是我所看到的),对于事务中的大量插入计数也是如此。
我不只是编造这个...
虽然红移是一个坏榜样,亚马逊黄鼠狼出Ç由捉弄它是如何存储的(唯一)排序键(基本上在红移主索引十岁上下结构)onsistency。在执行vacuum命令之前,主键只会变得越来越糟糕,您的数据库开始变成一个黑洞:查询进入,但没有结果出来。
显然,内部化的真空方案将防止在大规模进口期间经常发生的 Redshift 愚蠢行为。
我需要根据文档在我的表中的 JSON 列上添加索引我正在执行类似于下面的查询。
CREATE INDEX idxgin ON api USING gin (jdoc);
我收到以下错误:
错误:数据类型 json 没有用于访问方法“gin”的默认运算符类
提示:您必须为索引指定运算符类或为数据类型定义默认运算符类。
这是文档的链接。
Postgres 建议使用 autovacuum 删除死元组。但是运行 autovacuum 最终会使对同一个表的其他查询变慢吗?它是否添加了影响性能的锁(行级或表级)?CPU 上是否有重大负载或是否消耗了大量内存。
这将帮助我们决定是否应该为我们的一个具有大量写入和删除的表打开自动清理,或者我们是否应该在非高峰时间定期运行手动清理。
我们有一个 PostgreSQL 9.4.9 生产服务器,它正在复制到一个从属实例,但今天我发现该实例不同步!
显而易见的操作是重新创建从属节点,为复制活动设置指标和适当的警报,因此我们可以有效地监控主节点和从属节点之间的同步状态。
但是,由于同步失败,我想首先诊断问题并尝试确定其根本原因,因为这将是大约 6 个月内第二次发生这种情况。
问题:如何诊断复制过程中失败的内容,以便这次可以以更好的方式完成?
版本说明:
PostgreSQL 9.4.9 on x86_64-unknown-linux-gnu, compiled by gcc (Debian 4.9.2-10) 4.9.2, 64-bit
Run Code Online (Sandbox Code Playgroud)
从从节点,在/var/log/postgresql/postgresql-9.4-main.log我可以看到:
2017-07-18 19:43:55 UTC [12816-1] LOG: started streaming WAL from primary at 125D/68000000 on timeline 1
2017-07-18 19:43:55 UTC [12816-2] FATAL: could not receive data from WAL stream: ERROR: requested WAL segment 000000010000125D00000068 has already been removed
2017-07-18 19:44:00 UTC [12817-1] LOG: started streaming WAL from primary at 125D/68000000 on timeline 1 …Run Code Online (Sandbox Code Playgroud) postgresql replication data-synchronization postgresql-9.4 master-slave-replication
我试图找出外部排序性能,它依赖于 WORK_MEM 值。我已经测试过增加 WORK_MEM 并不总是加速外部排序(下面的例子,在 PostgreSQL 9.6 上测试过)。是否有关于设置 WORK_MEM 的任何指导,说 WORK_MEM 的值是使用外部排序对 4GB 表进行排序的最佳值?是否可以从表大小和 WORK_MEM 设置中估计 IO 的数量?
我知道我可以研究 tuplesort.c 和底层算法,有现成的结果吗?
create table t1
as
select
c as key
, cast('value' as char(5)) as val
from generate_series(1, 100000000) c;
--4223 MB
select pg_size_pretty(pg_total_relation_size('t1'));
\timing
--time - 146725.833 ms
SET WORK_MEM = '128MB';
create table t_128 as select * from t1 order by key;
--time - 148889.655 ms
SET WORK_MEM = '1024MB';
create table t_1024 as select * from t1 order …Run Code Online (Sandbox Code Playgroud) postgresql ×10
json ×3
performance ×2
acid ×1
autovacuum ×1
count ×1
null ×1
replication ×1
sorting ×1
windows ×1