当我对给定查询运行 EXPLAIN ANALYZE 命令时,我很难解释输出的时间值。例如(实际时间=8163.890..8163.893)。内部小数是否代表重复字符?抱歉,这可能是一个菜鸟问题,但我想确保我正确解释了结果。
-> GroupAggregate (cost=2928781.21..2929243.02 rows=1 width=27712) (actual time=8163.890..8163.893 rows=1 loops=1)
Run Code Online (Sandbox Code Playgroud) 相当简单的问题,可能在某处得到了回答,但我似乎无法为 Google 形成正确的搜索问题......
在查询该表的子集时,特定表中的列数是否会影响查询的性能?
例如,如果表 Foo 有 20 列,但我的查询只选择了其中的 5 列,那么有 20(而不是 10)列会影响查询性能吗?为简单起见,假设 WHERE 子句中的任何内容都包含在这 5 列中。
除了操作系统的磁盘缓存之外,我还担心 Postgres 的缓冲区缓存的使用。我对 Postgres 的物理存储设计一无所知。表存储在多个页面上(默认为每页 8k 大小),但我不太明白元组是如何从那里排列的。PG 是否足够聪明,只能从磁盘中获取包含这 5 列的数据?
我正在开发一个开发系统,我一直在恢复到一个数据库,比如“foo”,我用于开发目的。当我解决这些问题时,我一直在运行 DROP DATABASE foo。但是,我很快意识到我已经吃光了磁盘上的所有空间。废话。
来自不同逻辑数据库的 VACUUM FULL 是否从我之前删除的数据库中释放空间 (foo)?我从不同的逻辑数据库尝试了这个,并且回收了可用空间,但我认为这不足以解释我所做的所有 CREATE DATABASE/DROP DATABASE 调用。它可能只是对我运行的逻辑数据库进行了 VACUUM 处理。
必须有一种方法可以在不执行整个数据库初始化的情况下回收该空间?
编辑
所以我从备份中重新初始化了数据库,大致遵循这些步骤。恢复后,我在磁盘上回收了大量空间!这暂时有效,但有关如何清理删除的数据库的任何帮助仍然有用。
编辑 2
所以我设法收集了一些关于这个问题的更多信息......这是我想出的一个例子:
Initial partition size:
Size Used Avail Use% Mounted on
25G 8.1G 16G 35% /apps1
After creating my new database and populating it:
25G 18G 6.4G 73% /apps1
After Dropping the database using "DROP database mydb" from a separate logical DB:
25G 13G 11G 56% /apps1
Run Code Online (Sandbox Code Playgroud)
所以在我看来,新数据库在磁盘上占用了大约 9.6 GB。但是,删除后,回收的磁盘空间仅增加了约 4.6G。所以,大约有 5 GB 的空间让我想知道发生了什么!?
当我重新创建、填充和再次删除时,它会继续这个循环。
有没有人知道发出“DROP DATABASE”命令后有什么东西挥之不去?
我在 Postgres 8.3 中运行一个 plpgsql 脚本 - 我想通过 psql 将参数传递给这个脚本。我目前正在执行这样的脚本:
psql -d database -u user -f update_file.sql
Run Code Online (Sandbox Code Playgroud)
我遇到了这个链接,它解释了 PGOPTIONS 环境变量,但这不适用于“自定义”参数。即我收到一个错误,因为该设置未在 postgres.conf 文件中列出。
-bash-3.2$ export PGOPTIONS='--pretend=true'
-bash-3.2$ psql -d my_db -f update_database.sql
psql: FATAL: unrecognized configuration parameter "pretend"
Run Code Online (Sandbox Code Playgroud)
还有其他想法吗?理想情况下,我想避免环境变量...
使用 Postgres pl/pgsql,我尝试使用动态 EXECUTE 命令创建一个表,例如:
...
DECLARE
tblVar varchar := "myTable";
BEGIN
EXECUTE 'CREATE TABLE $1 (
foo integer NOT NULL,
bar varchar NOT NULL)'
USING _tblVar;
...
Run Code Online (Sandbox Code Playgroud)
但是,我继续收到错误消息
错误:“$1”处或附近的语法错误
如果我不使用$1
令牌,而是编写字符串,myTable
它就可以正常工作。
对 CREATE 调用使用动态语句是否有限制?
我有两个表,外键来自 T1->T2,处于一对多关系。也就是说,表 T1 中的 1 个元组与 T2 中的 0..N 个元组相关联。
为了创建一个简单的例子,假设 T1 是汽车,而 T2 是一个缺陷表。因此,一辆汽车可以有 0..N 个缺陷,我们将这些缺陷作为整数存储在 T2 中。
我想仅从包含缺陷 i1和i2 的汽车中的那些汽车中选择 * 。
相反,执行 OR 非常简单:
SELECT * FROM cars AS T1
WHERE EXISTS (
SELECT imperfection FROM Imperfections as T2
WHERE T1.uid = T2.uid AND (imperfection = 1 OR imperfection = 2)
);
Run Code Online (Sandbox Code Playgroud)
我一直在尝试使用交集设置逻辑,但在这一点上,我想知道我是否过于复杂了。
我似乎无法找到答案的相当简单的问题 - 我正在处理工会和差异,我想对结果执行 COUNT。目前,我不得不输出到一个文件并“wc -l”该文件(Postgres 打印减去 4)。必须有一种方法来包含 COUNT ...
SELECT tbl1.id EXCEPT (SELECT tbl2.id UNION tbl3.id);
Run Code Online (Sandbox Code Playgroud)
我想知道设置差异后的结果数量。感谢您提供任何意见!
postgresql ×7
disk-space ×1
dynamic-sql ×1
except ×1
explain ×1
performance ×1
plpgsql ×1
psql ×1