使用 PostgreSQL 9.1,我们在 PostgreSQL 的 VIEW 上执行查询时遇到问题。以下是情况:
我们有一个分区表“buz_scdr”,我们在它上面构建了一个视图“Swiss_client_wise_minutes_and_profit”。此 VIEW 的目的是连接来自不同表(包括“buz_scdr”表)的数据以进行高效查询。这个策略一直运行良好,直到表“buz_scdr”变得巨大(所有分区中的整体记录变得巨大。该表基于日期进行分区)。
在此 VIEW 上执行的查询开始需要很长时间(大约 5 到 10 分钟)。为了弄清楚为什么这个查询需要这么长时间才能执行,我们使用 EXPLAIN 命令来显示它的执行计划。我们使用的查询如下:
EXPLAIN SELECT * from "Swiss_client_wise_minutes_and_profit" where start_time = '2012-7-22 08:00';
Run Code Online (Sandbox Code Playgroud)
其结果在explain.depesz.com 上或如下:
Subquery Scan on "Swiss_client_wise_minutes_and_profit" (cost=2127919.71..94874537.55 rows=40474 width=677)
Filter: ("Swiss_client_wise_minutes_and_profit".start_time = '2012-07-22 08:00:00+00'::timestamp with time zone)
-> WindowAgg (cost=2127919.71..94773352.06 rows=8094839 width=148)
-> Sort (cost=2127919.71..2148156.81 rows=8094839 width=148)
Sort Key: cc.name, rdga.group_id
-> Hash Left Join (cost=1661.50..604234.77 rows=8094839 width=148)
Hash Cond: (((cc.company_id)::text = (rdga.company_id)::text) AND ((cs.c_prefix_id)::text = (rdga.dest_id)::text))
-> Hash …Run Code Online (Sandbox Code Playgroud) postgresql performance view partitioning subquery query-performance
我不知道这个问题是否更适合这里或 SO ...
这是我想启动的脚本(该函数的代码是从 SO 上的一个问题复制的):
\c mydb
create or replace function truncate_tables(username in varchar) returns void as $$
declare
stmt RECORD;
statements cursor for select tablename from pg_tables where tableowner = username;
begin
for stmt in statements loop
execute 'truncate table ' || quote_ident(stmt.tablename) || ' CASCADE ;';
end loop;
end;
$$ language 'plpgsql';
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
ERROR: syntax at or near "$1" LINE1: $1
QUERY $1
CONTEXT: SQL statement in PL/PgSQL function "truncate_tables" near line 5
Run Code Online (Sandbox Code Playgroud)
我是 Postgres …
我是 PostgreSQL 的新手,在使用以下查询时遇到了问题:
SELECT * FROM table1 WHERE ID = 1
Run Code Online (Sandbox Code Playgroud)
错误:列“id”不存在第 2 行:WHERE ID = 1
其中 ID 是我通过 GUI 工具添加的列。
然后我发现 ID 是我当前版本的 PSQL 中的一个关键字,应该被引用。但我无法识别这个 ID 是做什么用的。
在链接页面上有以下通知:
在学习表 C-1 之前,重要的是要了解在 PostgreSQL 中没有保留关键字 (==true) 的事实并不意味着与该词相关的功能没有实现。
所以,ID 没有被标记为 PostgreSQL 关键字,似乎有一个功能与之相关,但我找不到哪个。SELECT ID 本身变成与上面发布的相同的错误消息。
我读过,当数据库上有很多索引时,它会严重损害性能,但在 PostgreSQL 文档中我找不到任何关于它的信息。
我有一个非常大的表格,大约有 100 列和 10 亿行,我经常需要在许多不同的领域进行大量搜索。
如果我添加很多索引(可能是 10 个唯一列索引和 5 到 7 个三列索引),PostgreSQL 表的性能是否会下降?
编辑:随着性能下降,我的意思是SELECT性能;该数据库将每月仅一次,所以更新UPDATE和INSERT速度不是问题。
我想要一张显微镜载玻片表,除了基本 id、name、date_created 之外,每张载玻片还有许多可编辑的“属性”。
想象一张幻灯片有
其他一些幻灯片可能有例如:
我无法将所有这些存储在幻灯片表中,因为我希望用户能够选择使用过的属性或添加新的属性(如果他们愿意)。每个属性也应该有一个类型,因为有些是整数,有些是文本,有些是例如日期和时间,我很想为它们呈现一个小部件以简化这些值的编辑。
我计划使用MySQL,然后有人指出我使用PostgreSQL及其hstore,但这对我来说感觉像是一个边缘实验功能。有什么建议我应该怎么做?
这是我想出的,但对我来说感觉不对:

此外,如果有任何不同,所有这些都将在 Django (Python) 中结束。
这是我的两张表:
table1
qid[PK] |gid[PK] |abcd | xyz | date
---------------+---------+---------+------+------------
00001 | qwe | 54 | a | 1994-11-29
00002 | asd | 0 | s | 1994-11-29
00003 | azx | 50 | 0.25 | 1994-11-27
Run Code Online (Sandbox Code Playgroud)
表2
qid[PK] | gid[PK] | user[PK]
------------+---------+--------
00001 | qwe | shreya
00001 | qwe | nagma
00001 | qwe | koena
00001 | qwe | paoli
00002 | asd | anushka
00002 | asd | angelina
00003 | azx | jolie
00003 …Run Code Online (Sandbox Code Playgroud) 我正在使用 debian 压缩包,它说功能不存在?
postgresql pattern-matching postgresql-8.4 postgresql-extensions
我有这个查询将一些数据从t2into聚合t1。这样做是为了优化我正在处理的应用程序,以便减少对数据库的查询。我选择了下面的方法来确保我不必更新t1两次。
最大的问题是,我可能在这里遗漏了哪些索引,查询可以进一步优化吗?
update t1
set
col1 = t2.col1_count,
col2 = t2.col2_sum,
col3 = t2.col3_sum
from (
select
b.user_id, b.t1_id,
coalesce(count(b.id), 0) as col1_count,
sum(case when b.col5 = true then b.col2 else 0 end) as col2_sum,
sum(case when b.col5 = false then b.col3 else 0 end) as col3_sum
from t1 a
left join t2 b on b.t1_id = a.id
where
b.user_id = 1
group by b.user_id, b.t1_id
) as t2
where
t2.t1_id = t1.id;
Run Code Online (Sandbox Code Playgroud)
编辑 …
我们正在处理以下情况(PG 版本为 7.4.30):不知何故,pg_database 中缺少一个数据库(psql \l 列表不再显示它)。更多,虽然您仍然可以 \c 到它,\d 表列表只显示表的一小部分。现有表上的 \d 也显示丢失的列。但是,所有表(仍然可见或不可见)都可以通过 psql 查询,结果集中的实际数据和列似乎很好。
我们备份了数据文件夹,并在过去 24 小时内尝试将情况恢复到 pg_dump 可以工作的程度。不幸的是,尽管我们在之前的类似帖子中尝试了大量建议,但我们还没有完全成功。Reindex 没有帮助,但是“VACUUM FULL FREEZE [ANALYZE]”确实释放了已用磁盘空间的 70%(14GB 到 4)。当然,数据库并没有像它应该的那样定期清空:
警告:某些数据库在超过 20 亿个事务中没有被清空详细信息:您可能已经遭受了事务环绕数据丢失。
没有冻结选项的完全真空确实使所有数据库、表和用户可见,但会重复,即 \l 然后显示数据库两次,数据库上的 \d 列出所有表两次。postgres 用户在 pg_user 等中出现两次。如果数据库未列出,pg_dump 将不起作用,如果 postgres 用户重复,则 pg_dump 将不起作用。
这对任何人来说听起来都很熟悉吗?遗憾的是,所有数据似乎都在那里,但我们无法将其恢复并还原到干净的数据库中。我们将不胜感激任何建议。
谢谢!
PS:我也在等待来自pgsql-admin邮件列表的反馈。
我在 ubuntu 12.04 上使用 postgresql 9.1。我已经安装了 depot 软件包。
我在我的系统中添加了一个新分区,我想在这个分区上创建一个 postgresql 数据库(它将完全专用于这个数据库)。
我的 pgdata 位于var/lib/postgresql/9.1/main. 我打算停止 postgresql 服务,将 pgdata 内容复制到新分区,然后创建一个指向新分区的符号链接,chown将新目录指向 postgres 用户,重新启动 postgresql ......但恐怕这一切看起来更像是一个黑客。
有没有办法专门在指定的分区上创建数据库?更“规范”的东西(不是与 ubuntu 的文字游戏)
postgresql ×10
performance ×2
cursors ×1
dynamic-sql ×1
features ×1
index ×1
jdbc ×1
join ×1
mysql ×1
partitioning ×1
plpgsql ×1
subquery ×1
syntax ×1
view ×1