我正在使用 Postgres 9.5,我想弄清楚如何使用 JSON 数组更新 postgres 表。我希望数组中的每个对象都对应一个新行,每个键对应一个列,每个值都是要插入到该列中的数据。我试图用一个函数来做到这一点。这里的数据格式:
[
{ col1: a, col2: 5, col3: 1, col4: one},
{ col1: b, col2: 6, col3: 2, col4: two},
{ col1: c, col2: 7, col3: 3, col4: three},
{ col1: d, col2: 8, col3: 4, col4: four},
]
Run Code Online (Sandbox Code Playgroud)
这是我的预期输出:
col1 (varchar)| col2 (integer) | col3 (integer) | col4 (varchar)
-----------------+----------------+--------------------+------------------
a | 5 | 1 | one
b | 6 | 2 | two
c | 7 | 3 | three
d | …Run Code Online (Sandbox Code Playgroud) 如果表在模式中不包含该列,您能否给出向所有表添加一列的命令?
例如,模式schema1包含 50 个表,其中 20 个表包含名为 的列colTest。
我需要将该列添加colTest到剩余的 30 个表中。
我在 SQL Server 中使用了调优顾问工具,它根据给定的工作负载提供索引建议。
我想为 PostgreSQL 创建一个类似的工具。我浏览了一些研究论文。但我无法找到 SQL Server Tuning Adviser 用于提供索引建议的确切算法。
如果有人知道该算法或我可以从哪里获得该算法的任何来源,请指导我。请注意,我想根据工作负载提供建议,而不是针对单个查询。提前致谢。
我们有一个大型查询,当客户“第一次运行它时,一大早......”
所以,我发现pg_prewarm我想使用加载到 PG 的缓冲区缓存一定数量或最近访问的行(插入、更新或删除)来自上述查询中使用的几个表。
此外,我需要确保“预热”不超过 PG 的缓存(我相信是 shared_buffers 设置,还是我错了?)为了预热单个表的最后 1000 页,我可以这样做:
SELECT pg_prewarm(
'mytable',
-- "pre warm" last 1000 pages
first_block := (
SELECT pg_relation_size('mytable') / current_setting('block_size')::int4 - 1000
)
);
Run Code Online (Sandbox Code Playgroud)
问题 1:这种方法有意义吗?
诀窍是 pg_prewarm 只能加载一定数量的页面,所以我需要计算“某个表的页面中有多少活动行”
-- show some settings
SELECT current_setting('block_size')::int4 AS page_size_bytes; -- 8192
SHOW shared_buffers; -- 512 MB
-- https://www.postgresql.org/docs/current/static/pgstattuple.html
--CREATE EXTENSION pgstattuple;
-- find out live row size and live rows per page
SELECT 'mytable'AS table_name, pg_size_pretty(tuple_len / tuple_count) AS live_row_size, 8192.00 / (tuple_len …Run Code Online (Sandbox Code Playgroud) postgresql performance size disk-space postgresql-performance
我在命令行界面中使用 PostgreSQL。我想为集群中的每个数据库永久激活一个\timing命令,所以每次我连接到数据库时 - 这个参数是打开的。我在postgresql.conf文件中进行了搜索,但没有找到类似我想打开的内容。
我的 PostgreSQL 在 x86_64 Ubuntu 16.04.2 上是 9.5.4。
我决定使用可为空字段或 jsonb 来存储用户配置文件。最初,这将用于联系人:email和phone。我预计稍后可能会添加其他列,例如mobile和website。此外,可能还有其他不相关的字段,例如设置/首选项、保存的搜索等。
我已经决定我不想为此使用任何形式的键值存储(或任何涉及多对多关系的模式),除非有非常好的理由。
jsonb 的优点:
jsonb 的缺点:
还有什么要添加到这个优点/缺点列表中的吗?尽管我只想使用可为空的列,但我认为忽略 jsonb 是一种疏忽 - 这似乎是一个令人信服的选择。
我有一个带有 Debian Jessie 和 Postgresql 9.4 的专用数据库服务器
客户端:A 是一个 Tomcat Java 应用程序,它使用扭矩与连接到数据库服务器的 JDBC 驱动程序。
问题:在使用新值更新行时,更新失败,因为应用程序传输了错误的数据类型。
错误信息:
列“device_macaddr”的类型是 macaddr,但表达式的类型是在字符 159 处变化的字符
Torque 生成的更新语句:
UPDATE device SET device_last_change = $1, device_macaddr = $2 WHERE device_ID = $3
Run Code Online (Sandbox Code Playgroud)
postgresql 中数据类型的定义:
last_change is timestamp (0) without time zone NOT NULL
device_macaddr is macaddr NOT NULL
device_id is bigint NOT NULL
Run Code Online (Sandbox Code Playgroud)
我们最近确实将 DB 和 jdbc 驱动程序从 8.4 更新到 9.4
我能够查明对 jdbc 驱动程序的更改,但无法找到准确显示此行为更改的更改日志。
从那以后,上面的语句似乎不再起作用,而尽管当时可能是错误的数据类型,但它以前仍然起作用。
有没有办法“减轻”来自 Postgres 9.4 DB Server 的针对特定情况的严格检测?
我确实阅读了 jdbc 驱动程序的增强以包含那些额外的数据类型,但是这对我来说还没有用,所以我尝试在我拥有的选项的另一端找到解决方法。
我收到“数据库不存在错误”,即使数据库存在:
postgres=# GRANT ALL PRIVILEGES ON DATABASE Owino to OdooD;
Run Code Online (Sandbox Code Playgroud)
错误:数据库“owino”不存在
Name | Owner | Encoding | Collate | Ctype | Access privileges
Owino | dominus | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
postgres| postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =Tc/postgres +
| | | | | postgres=CTc/postgres +
| | | | | orokon=CTc/postgres +
| | | | | powerbidev=CTc/postgres+
| | | | | odoodev=CTc/postgres
Run Code Online (Sandbox Code Playgroud) 我试图从我的数据库中删除一个元素。我要删除的元素位于一个名为 playerContainer 的 JSON 对象中,该对象包含一个名为玩家的数组。这一切都位于一个名为 site_content 的表中。我正在尝试根据它的 ID 删除该对象。
这是示例 JSON
"playersContainer": {
"players": [
{
"id": "1",
"name": "Nick",
"teamName": "Shire Soldiers",
"ratings": [
1,
5,
6,
9
],
"assists": 17,
"manOfTheMatches": 20,
"cleanSheets": 1,
"data": [
3,
2,
3,
5,
6
],
"totalGoals": 19
},
}
Run Code Online (Sandbox Code Playgroud)
下面是我试图用来删除数组中的对象的查询
UPDATE site_content
SET content = jsonb_set(content, '{playersContainer,players}'::text[], content->'playersContainer'->'id'->'players' #- '{1}'::jsonb
Run Code Online (Sandbox Code Playgroud)
但是,这似乎删除了表中内容行中的所有数据,而不仅仅是我的玩家数组中 ID 为 1 的数组。
例如,如果我放置一个 iproute,就像这样
sudo iptables -I INPUT -p tcp --syn -m conntrack --ctstate NEW --ctstatus CONFIRMED --dport 5433 -j LOG
Run Code Online (Sandbox Code Playgroud)
我可以看到每次尝试连接到我的数据库时都有两个条目。
[598519.458578] IN=lo OUT= MAC=00:00:00:00:00:00:00:00:00:00:00:00:08:00 SRC=192.168.0.101 DST=192.168.0.101 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=49795 DF PROTO=TCP SPT=58554 DPT=5433 WINDOW=43690 RES=0x00 SYN URGP=0
[598520.875428] IN=lo OUT= MAC=00:00:00:00:00:00:00:00:00:00:00:00:08:00 SRC=192.168.0.101 DST=192.168.0.101 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=65392 DF PROTO=TCP SPT=58560 DPT=5433 WINDOW=43690 RES=0x00 SYN URGP=0
Run Code Online (Sandbox Code Playgroud)
为什么 psql 需要在两个单独的端口(58554 和 58560)上连接到 PostgreSQL 服务器?也就是说,当我运行一次时,我会收到两条类似上面的消息..
psql -d test -h 192.168.0.101 -p 5433
Run Code Online (Sandbox Code Playgroud) postgresql ×10
json ×2
cast ×1
connectivity ×1
delete ×1
disk-space ×1
dynamic-sql ×1
index ×1
index-tuning ×1
jdbc ×1
linux ×1
null ×1
performance ×1
psql ×1
schema ×1
size ×1
sql-server ×1
ubuntu ×1
update ×1