大家好 我的 PostgreSQL 数据库查询有问题,想知道是否有人可以提供帮助。在某些情况下,我的查询似乎忽略了我创建的用于连接两个表data和data_area. 发生这种情况时,它使用顺序扫描并导致查询速度慢得多。
顺序扫描(~5 分钟)
Unique (cost=15368261.82..15369053.96 rows=200 width=1942) (actual time=301266.832..301346.936 rows=153812 loops=1)
CTE data
-> Bitmap Heap Scan on data (cost=6086.77..610089.54 rows=321976 width=297) (actual time=26.286..197.625 rows=335130 loops=1)
Recheck Cond: (datasetid = 1)
Filter: ((readingdatetime >= '1920-01-01 00:00:00'::timestamp without time zone) AND (readingdatetime <= '2013-03-11 00:00:00'::timestamp without time zone) AND (depth >= 0::double precision) AND (depth <= 99999::double precision))
-> Bitmap Index Scan on data_datasetid_index (cost=0.00..6006.27 rows=324789 width=0) (actual time=25.462..25.462 rows=335130 loops=1)
Index Cond: …Run Code Online (Sandbox Code Playgroud) 我正在考虑使用 CLUSTER 按索引重新排序表。我知道这种表数据的重新创建会使所有现有的索引膨胀或无用。我已经看到一些迹象表明在 CLUSTER 之后需要 REINDEX。我发现其他参考资料表明 CLUSTER执行REINDEX。在官方文档说,一切尽在不言中约REINDEX是集群的一部分或需要(虽然它确实表明集群运行后分析),
任何人都可以明确地(即对官方文档进行某种参考)说在 CLUSTER 之后是否需要 REINDEX?
我的数据库服务器上的一些查询似乎需要很长时间才能响应,而且我认为 CPU 使用率很高。运行时ps aux,我看到大约 250 个“空闲”连接(我认为太多了)。我还没有开始做一个完整的诊断,但我想知道这是否是一个开始寻找的好地方。
我还将 PgBouncer 与事务级池一起使用。我怀疑我可以idle通过调整池大小轻松减少连接数。但是,除非有充分的理由,否则我不想开始做太多更改。
idlePostgreSQL 9.2 中的很多连接会影响性能吗?
非常感谢!
我有大量的天气模型数据被放入 PostgreSQL 数据库。该机器具有 8 个内核和 16 GB 的 RAM。我正在使用 PostGIS 2.1 运行 PostgreSQL 9.3。每个表都有不同种类的天气数据(温度、露点、风等)。每个表将有 6-7 列:纬度、经度、点几何、高程、模型相关的日期时间以及 1-2 个感兴趣的数据值。数据将主要按时间和高程查询边界框。每个表将有大约 145,757,360 行(早于现在不再相关的数据将被删除)。我粗略估计每个表的大小约为 10 GB,没有索引。(这是 52 字节的数据加上每行 23 字节的开销)。随着新模型数据可用,数据将定期更新/插入。笔记:
所以我正在研究这两个计划:
更远,
传递数据时,选择会比聚集索引更快吗?如果同时发出多个请求,答案是否会改变?
谢谢你。我希望我提供了所有需要的数据。如果没有让我知道,我会添加它。
postgresql database-design partitioning postgis postgresql-9.3
添加NOT NULL带有DEFAULT值的列时- PostgreSQL 是否优化此操作?
如果表有 n 行,未优化的 alter-table-add-column 将产生 n 次写入默认值 - 显然,这可能非常痛苦。通过优化,数据库将立即创建新列,仅存储默认值的一个副本,当在合适的索引数据结构中找不到该列的非默认值时,该副本将返回。
例如Oracle 11g 就有这样的优化。
我正在写一份工作,将数据从旧设计转换为新设计。在这个过程中,我需要将 id 从插入到一个单独的表中,并在插入到目标表中使用它,如下所示:
CREATE TABLE t1 {
t1_id BIGSERIAL,
col1 VARCHAR
};
CREATE TABLE t2 {
t2_id BIGSERIAL,
col2 VARCHAR, -- renamed from col1 to avoid confusion
t1_id BIGINT REFERENCES t1.t1_id
};
Run Code Online (Sandbox Code Playgroud)
我定义了与以下形式匹配的 SQL:
WITH ins AS (
INSERT INTO t1 (t1_id) VALUES (DEFAULT) RETURNING t1_id
) INSERT INTO t2
(col1, t1_id)
SELECT
a.val1, (SELECT * FROM ins)
FROM t3 a;
Run Code Online (Sandbox Code Playgroud)
我希望它为.. 的SELECT * FROM ins每一行运行SELECT.. 但它只运行一次,并将该值用于SELECT.. 如何重构我的 SQL 以获得所需的行为?
编辑4
t1 最终看起来像:
1,<NULL> …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用一些动态 SQL 在函数内重新创建表的结构。
EXECUTE 'CREATE TABLE ' || my_table_name || '_bk' ||
' (like ' || _my_table_name || ')';
Run Code Online (Sandbox Code Playgroud)
这将类似于:
CREATE TABLE my_table_bk
(like my_table);
Run Code Online (Sandbox Code Playgroud)
但我需要放弃所有约束。使用EXCLUDING CONSTRAINTS在类似的选项,它仍然复制NOT NULL约束(文档证实了这一行为):
CREATE TABLE my_table_bk
(like my_table EXCLUDING CONSTRAINTS);
Run Code Online (Sandbox Code Playgroud)
问题是,如何在没有 NOT NULL 约束的情况下重新创建表结构,或者删除表中的所有 NOT NULL 约束?
我有一个用 Perl 编写的非分叉游戏守护进程,它使用 acync 查询将玩家统计数据写入 PostgreSQL 9.3 数据库。但是当我需要从数据库中读取某些内容时(例如玩家是否被禁止或玩家是否具有 VIP 身份),那么我使用同步查询。
这会使游戏停止一小会,直到从数据库中读取该值。
我无法重写我的游戏守护程序以使用异步查询来读取值(我尝试过,但它需要进行太多更改),所以我的问题是:将几个不相关的查询组合在一起是否有意义(我需要在新玩家连接) 到 1 个过程,如何同时将多个值返回到我的 Perl 程序?
我当前的查询都以玩家 ID 作为参数并返回 1 个值:
-- Has the player been banned?
select true from pref_ban where id=?
-- What is the reputation of this player?
select
count(nullif(nice, false)) -
count(nullif(nice, true)) as rep
from pref_rep where id=?
-- Is he or she a special VIP player?
select vip > now() as vip from pref_users where id=?
-- How many …Run Code Online (Sandbox Code Playgroud) 我想将drop特定数据库的特定架构中的所有表和函数(不仅是用户拥有的表和函数)的权限授予特定角色。但是,GRANT ALL PRIVILEGES这还不够,我没有找到如何在不将角色设为超级用户的情况下进行操作 - 超级用户对同一服务器上的其他数据库拥有权限,这不是我想要的。我不介意仅限于特定数据库的超级用户权限,但我不知道该怎么做。
我的代码:
CREATE USER _administrator PASSWORD 'pwd12345';
CREATE ROLE administrator NOLOGIN ADMIN _administrator;
GRANT ALL PRIVILEGES ON DATABASE "myDB" TO administrator;
GRANT ALL PRIVILEGES ON SCHEMA public TO administrator;
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO administrator;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO administrator;
GRANT ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public TO administrator;
Run Code Online (Sandbox Code Playgroud)
administrator是myDB数据库管理员组,_administrator是我的客户端应用程序能够以身份登录的最强大的角色。
我错过了什么或做错了什么?
作为一个非 DBA 的人,我谦虚地对待你们,我确信我的问题充满了概念上的缺陷,并且“这取决于”地雷。我也很确定,你们所有选择回答的人都会想要比我目前所能提供的更多的细节。
也就是说,我对以下情况感到好奇:
如果我连续运行它们,一个接一个地运行,我预计平均需要 7 分钟才能完成。这合理吗?
然而,更重要的是,如果我同时运行这两个查询呢?同时进行两个独立的连接。
现在,如果我同时运行 1,000 个非平凡的查询,我有预感它会导致整体速度变慢。在这种情况下,瓶颈可能在哪里?处理器?内存?驱动器?
同样,我知道在不知道具体细节(我没有)的情况下可能无法准确回答这个问题。我正在寻找一些一般准则,以便在提出以下问题时考虑:
postgresql ×10
performance ×3
alter-table ×1
concurrency ×1
ddl ×1
functions ×1
optimization ×1
partitioning ×1
permissions ×1
plpgsql ×1
postgis ×1