我在进行聚类时遇到计算机崩溃。计算机恢复后临时文件尚未清除。现在如何安全地清除它们?
更新
Windows 操作系统。pgsql_tmp 目录为空,但磁盘空间仍然被位于表基文件夹中的集群临时文件占用。
我这样做:
BEGIN;
TRUNCATE TABLE test RESTART IDENTITY;
-- Tons of INSERTS to the test table here, taking minutes or many seconds each time.
COMMIT;
Run Code Online (Sandbox Code Playgroud)
这从根本上来说并没有什么问题,不是吗?尽管事务在最终提交之前需要很长时间,但在这种情况下,整个操作只需“原子”,并且不让其他脚本看到空或半填充的测试表,对吧?
在它花很长时间完成的同时,其他查询仍然会继续工作,对吗?这就是我对交易的理解崩溃的地方。在我看来,保证我能够在该事务块运行时从表中进行选择,但是也可以插入、删除和更新吗?
我的大脑无法理解数据库到底如何处理这个问题。这就是所谓的僵局吗?或者他们会继续从“幽灵表”中插入、更新和删除,并且当长时间运行的事务最终提交时所有更改都会丢失?这听起来不对。我假设在该事务运行时它会拒绝对表进行任何“更改”操作,对吗?
是的,我今天实际上又看了一遍关于事务和死锁的手册。有些人能够阅读一次并完全理解某些内容,而其他人(例如我)可能会花很多年并反复说服自己他们已经理解了某些内容,结果却看到记录的“无意义”错误以及实时生产应用程序中发生的坏事由于误解了这样复杂的事情实际上是如何运作的。
为什么我可以使用 UUID 对行进行排序:
SELECT uuid_nil()
ORDER BY 1;
Run Code Online (Sandbox Code Playgroud)
但我无法计算最大值:
SELECT max(uuid_nil());
Run Code Online (Sandbox Code Playgroud)
[42883] 错误:函数 max(uuid) 不存在
提示:没有函数与给定名称和参数类型匹配。您可能需要添加显式类型转换。
我知道我可以转换为字符类型 orORDER BY和LIMIT 1。我只是好奇为什么我必须使用解决方法。
我的应用程序正在执行以下 psql 查询,并且运行速度非常慢:
SELECT COUNT(*)
FROM (
SELECT 1 AS one
FROM "large_table"
WHERE "large_table"."user_id" = 123
ORDER BY "large_table"."id" desc
LIMIT 1 OFFSET 30
) subquery_for_count;
Run Code Online (Sandbox Code Playgroud)
当我将 更改ORDER BY为时ASC,它的运行速度快了 100 倍。我在 id 上有默认的主键索引,并且我已经尝试按降序顺序为 id 添加附加索引,但这似乎没有什么区别。
当我运行解释分析时,我发现它在慢速查询 ( ) 上使用向后索引扫描desc。我尝试手动禁用会话的索引扫描,发现查询运行时间为 40 秒,而不是 2 分钟,这是一个显着的改进。
知道如何在按 DESC 排序时尝试提高此查询的速度吗?我读过,对于 b 树索引,无论排序顺序如何,它通常应该为您提供相同的性能,但情况似乎并非如此。
我需要能够从.sql使用 .bashrc 执行文件的 bash shell 传递环境变量psql。
psql我正在运行的命令是:
su postgres -c "psql -v ON_ERROR_STOP=1 -v dbname=example -v dbuser=example -e" < ./create-db.sql
Run Code Online (Sandbox Code Playgroud)
我放置的位置example通常分别设置为$DATABASE_NAME和DATABASE_USER,在执行命令之前在 bash 脚本中设置psql。
该create-db.sql文件是:
\connect postgres
DROP DATABASE IF EXISTS :dbname;
DO $$BEGIN
CREATE USER :dbuser;
EXCEPTION WHEN duplicate_object THEN
RAISE NOTICE 'user already exists';
END$$;
ALTER ROLE :"dbuser" SET search_path TO :"dbname",public;
CREATE DATABASE :"dbname"
OWNER=:dbuser
ENCODING=UTF8
LC_COLLATE='en_US.UTF-8'
LC_CTYPE='en_US.UTF-8'
TEMPLATE=template0;
\connect :"dbname"
CREATE SCHEMA …Run Code Online (Sandbox Code Playgroud) 我有一个 Postgres 表,如下所示:
| 用户身份 | 名 | 姓 | 电子邮件地址 | 角色 |
|---|---|---|---|---|
| 68f00c4c-5dff-4886-a584-d44a23e47160 | 大卫 | 桑 | 大卫@example.com | 行政人员 |
| 3ed36117-e632-4b8b-b672-0b29f5f8b5c9 | 马丁 | 休斯 | martin@example.com | 顾客 |
我想写一份政策:
first_name,last_name和,但显然不是他们的或(因为这将授予客户管理权限)email_addressuser_idroleuser_id所有记录之外的所有字段(包括更改其他用户的角色)。我是 Postgres 的新手,我正在尝试掌握编写行级安全策略的技巧。我很难在 SQL 中阐明更复杂的策略,因此如果有人能为我的应用程序中的场景提供示例,我将不胜感激。
我正在使用 Supabase,它有一个auth.uid()函数(示例),其中包含 JSON Web 令牌中的用户 ID。
目前 Postgres 12.5 上有一个非常大的表,包含超过 22 亿行。表的总大小(包括索引)为 500 GB。我们需要执行一个查询,以便从数据集中找到一组有效行并对它们进行更新。该查询看起来像这样:
select id, col4 from table where col1=$1 and col2=$2 and col3='f' and col4>0 order by col5 limit 10
Run Code Online (Sandbox Code Playgroud)
为了服务此查询,表上有一个索引ON (col1, col2, col5),并且查询使用此索引。到目前为止,一切都很好。当缓冲区未命中时数据库需要执行大量磁盘查找时,就会出现问题。这会导致查询等待DataFileRead。
到目前为止,我们使用的是 16 vCPU 和 128 GB 的机器,存储类型为 io1,预配置 IOPS 为 20000 进行托管(托管在 AWS RDS 上)。我们一开始配置的 IOPS 约为 3000,并不断增加它,希望通过积极的自动清理和数据本地化,它能够稳定在某个值。autovacuum 的配置方式是每隔几天在此表上运行一次。我们最近遇到一个问题,读取 IOPS 开始达到 20000,并且应用程序变得太慢。由于我们无法再在之前的机器上提供超过 20000 的 IOPS,因此我们升级到了一台更大的机器,其大小恰好是原来的两倍。
在较大的计算机上,我们观察到即使读取 IOPS 现在也已降至约 5000,并且该计算机现在在峰值时间消耗的总体 IOPS 约为 6000,并且查询时间精确地减半。我们假设,这肯定与shared_bufferpostgres 现在可用于将热引用行保留在缓存中的更高版本有关。
问题是我们现在使用的机器以大约 5% 的 CPU 负载运行,并且还有 184 GB 的 RAM 仍未使用。总而言之,这台机器的利用率严重不足。我们希望通过对参数进行任何更改来使用较小的机器,以便该查询可以在一些可容忍的延迟限制下运行。我们在之前的机器上尝试过多次内存调整,以充分利用RAM。但增加到shared_buffer …
我用来pg_stat_statements查找生产 PostgreSQL 13 中的慢查询。有两件事:
我不确定此扩展对性能的影响。
我可以做些什么来提高其性能吗?下面的查询需要 > 1 秒 - 有什么建议吗?
-- add the plugin
create extension pg_stat_statements;
select pg_stat_reset();
select pg_stat_statements_reset();
Run Code Online (Sandbox Code Playgroud)
进而:
-- find slow queries using the extension:
select * from pg_stat_statements order by total_exec_time desc limit 50;
Run Code Online (Sandbox Code Playgroud) 我有一个表,其中有一列的值为外键,但外键的目标表因行而异。相关表可以仅根据键值来确定,并且存在一小组固定的此类表。
\n我想在此处添加外键约束,以便我的 DBMS 可以确保引用完整性。当然,我不能直接执行此操作,但我有一个建议的解决方案,其中涉及带有传入和传出外键约束的中间“转发表”。我正在寻找评论:
\nGENERATED ALWAYS AS ... STOREDPostgres列的这种使用是否合理或可疑;为了说明该解决方案,请考虑一个存储“用户”和“组”的简单数据库。用户和组均由整数 ID 作为键控,\n并且 ID 的某些位被保留以告知其 ID 类型:
\n-- User and group IDs are both integers, but are in disjoint subsets of the key\n-- space, distinguished by the low 8 bits.\nCREATE DOMAIN userid AS int8 CHECK ((VALUE & 255) = 1);\nCREATE DOMAIN groupid AS int8 CHECK ((VALUE & 255) = 2);\n\nCREATE TABLE users(\n user_id userid …Run Code Online (Sandbox Code Playgroud) 我正在使用由脚本( Osm2pgsql )创建的 postgres 数据库。它创建了一些类型为_text的二维数组的字段text。我试图理解为什么它不只是创建一个text[][]字段,以及为什么这种类型存在于 postgres 中。
我可以在文档中找到这个链接,其中写着:
当您定义新的基本类型时,PostgreSQL 会自动提供对该类型数组的支持。数组类型通常与基类型具有相同的名称,并在前面添加下划线字符 (_)。
但我不明白为什么当文本是 postgres 的内置类型时它使用这个“下划线”类型名称?