我知道这是一种“精确”的数据类型,尽可能准确地表示数字,以便不会出现诸如或数据类型numeric
之类的浮点错误。float
real
但是呢numeric(p,s)
?由于固定比例,它必须近似于一个数字,但它是否存在浮点不准确性,或者它是“安全的”?我找不到有关它的任何信息。也许这是显而易见的,但我想更好地理解这方面。
我知道这是一种“精确”的数据类型,尽可能准确地表示数字,以便不会出现诸如或数据类型numeric
之类的浮点错误。float
real
但是呢numeric(p,s)
?由于固定比例,它必须近似于一个数字,但它是否存在浮点不准确性,或者它是“安全的”?我找不到有关它的任何信息。也许这是显而易见的,但我想更好地理解这方面。
我遇到了一个奇怪的情况,让我很头疼,解决之后我也想了解为什么。
基本上,用户拥有执行“触发器”所需的所有权限(它实际上是具有关联的 ON DELETE CASCADE 的外键约束)以及触发器本身触及的所有对象的所有权限,但是当他执行触发器时,他实际上使用了对象的所有者权限,而不是他自己的权限。所有者的权限比用户的权限少,因此它给出了一个非常神秘的错误。
我知道理解我的意思很复杂,所以我创建了一个希望能够澄清的工作示例。我创建的模式是一个 Spotify 类型的玩具示例,其中有用户和艺术家,并且用户有他们关注的艺术家列表。
使用超级用户执行以下所有操作(仅为简单起见)
-- ALL DATA
create schema website;
create table public.artists (
id_artist serial primary key,
name text not null unique
);
insert into public.artists (name)
values ('Heilung'), ('Rammstain'), ('Iron Maiden');
create table website.users (
id_user serial primary key,
email text not null unique
);
insert into website.users (email)
values ('[email protected]'), ('[email protected]');
create table website.users_list (
id_user int not null,
id_artist int not null,
CONSTRAINT user_fk FOREIGN KEY (id_user) REFERENCES website.users (id_user),
CONSTRAINT artist_fk FOREIGN KEY (id_artist) REFERENCES public.artists (id_artist) ON DELETE CASCADE);
insert into website.users_list (id_user,id_artist)
values (1,1), (1,2), (1,3), (2,1), (2,3);
-- USERS AND PRIVILEGES
create user jenny with password '123';
create user tommy with password '123';
-- tommy is owner but has zero privileges
alter table website.users_list owner to tommy;
-- jenny is not owner but has all privileges
grant usage, create on schema website to jenny;
grant all on all tables in schema website,public to jenny;
grant usage on all sequences in schema website to jenny;
然后使用用户 Jenny 逐一运行这些查询。
--1)
select *
from website.users_list ul;
--2)
select *
from artists a;
--3)
delete from artists
where id_artist = 3;
第一个和第二个查询正常工作,因为 Jenny 可以在 website.users_list 和 public.artists 上执行 SELECT。她显然拥有模式网站的使用权限。但第三个她却做不到。它给出了这个看似毫无意义的错误。
ERROR: permission denied for schema website
当她对 public.artists 执行 DELETE 操作时,她实际上触发了 website.users_list 的外键约束,因此必须从 website.users_list 中删除与 id_artist = 3 的艺术家相关的所有行。但在那一刻,她正在使用汤米(website.users_list 的所有者)的权限,正如我们上面所看到的,汤米没有模式网站上的使用权限,从而出现了奇怪的错误。
有人可以向我解释为什么会发生这种情况吗?当用户拥有所有必要的权限时,表所有者与运行触发器有什么关系?我发现这非常令人困惑,坦率地说调试是一场噩梦(不幸的是,我是根据个人经验发言的)。
假设我有这两张桌子
CREATE TABLE users (
id_user serial primary key,
name text NOT NULL
);
CREATE TABLE useless_table (
id serial primary key,
id_user int4 NOT NULL,
CONSTRAINT useless_table_id_user_fk FOREIGN KEY (id_user) REFERENCES users(id_user)
);
users
是所有数据库中最拥挤的表,查询不停,甚至是长而重要的查询,所以我无法杀死所有这些。useless_table
正如您所见,我想放弃它,它有一个外键引用users
,每次我启动DROP
命令时,它都会获得一个锁,即使是最简单的SELECT
(users
没有任何查询正在进行useless_table
)。我什至试图删除外键,useless_table
但它获得了与删除表相同的锁。
也许我是梦想家,但有没有办法让它不锁定所有东西而只是掉落useless_table
?
我正在考虑NOT VALID
外键、禁用触发器、可延迟约束或此类问题,但我对它们不是很了解,也不想使用它们弄得一团糟。
有什么建议吗?
我已经阅读了@Mike 对如何判断数据库调整是否富有成效(PostgreSQL)的回答,这就是我正在考虑的用于监控我的数据库(Web 应用程序、许多连接、大量写入和一直在读取,非常动态的数据)。
该方法总结如下:我想知道我的数据库是否能够跟上工作负载,随着时间的推移它是否具有相同的准备状态,以及最终我的调整和清理是否有用。因此,对于一般的健康指标,监控查询时间(对于 Web 应用程序和数据流使用的代表性查询)对我来说是明智和紧凑的(查询时间增加而没有实质性变化 => 性能正在下降)。但我的问题是,是吗?除了链接的问题之外,我还没有找到这种方法的其他来源,而且我在如何实现所有这些方面还有一些漏洞,因此从其他示例/经验或手册中了解更多信息将非常有用。即使知道这种方法不值得做也会很有趣。
仅供参考,我读过pgbench
,但它对我来说似乎很无菌,我的意思是,它确实提供了一个参考点,但它对我的表、我的索引、关于我的数据库的活动环境说了什么?(我希望你能理解我的意思)也许我pgbench
看错了,但这正是我想知道的!
注意:我与 Postgres 一起工作,所以我对 Postgres 的特定答案会很棒......但不是必需的!
我有一个由许多节点脚本组成的系统,它们一直在 Postgres 数据库上自动读取和/或写入。其中一个脚本随机陷入僵局。我想对此进行调试,但问题是我不知道哪个其他查询导致死锁。(我使用pg)
所以我的问题是:
如果我发现这样的错误
{ error: deadlock detected
at Connection.parseE (/data/jenkins/workspace/03-10-Lotti-watcher-lotti-mod/import/node_modules/pg/lib/connection.js:604:13)
at Connection.parseMessage (/data/jenkins/workspace/03-10-Lotti-watcher-lotti-mod/import/node_modules/pg/lib/connection.js:403:19)
at Socket.<anonymous> (/data/jenkins/workspace/03-10-Lotti-watcher-lotti-mod/import/node_modules/pg/lib/connection.js:123:22)
at Socket.emit (events.js:197:13)
at addChunk (_stream_readable.js:288:12)
at readableAddChunk (_stream_readable.js:269:11)
at Socket.Readable.push (_stream_readable.js:224:10)
at TCP.onStreamRead [as onread] (internal/stream_base_commons.js:150:17)
name: 'error',
length: 336,
severity: 'ERROR',
code: '40P01',
detail:
'Process 2376 waits for ShareLock on transaction 55837412; blocked by process 22585.\nProcess 22585 waits for ShareLock on transaction 55837411; blocked by process 2376.',
hint: 'See server log for query details.',
position: undefined,
internalPosition: undefined,
internalQuery: undefined,
where: 'while locking tuple (226684,50) in relation "lotti"',
schema: undefined,
table: undefined,
column: undefined,
dataType: undefined,
constraint: undefined,
file: 'deadlock.c',
line: '1146',
routine: 'DeadLockReport' }
我可以获取其他进程的查询和/或用户以隔离和识别问题吗?或者类似的东西,如果它有意义的话。
我看到了这个问题Bit vs. Boolean columns。
对于 Postgres,我问自己同样的问题:单个数字整数列是否占用与布尔值相同的磁盘空间?在大表(约 50 列 x 约 5000 万行)中,哪一个表现最好?我怎样才能找到这个?