我可能在标题中问错了问题。以下是事实:
在我们基于 Django 的站点的管理界面上进行客户查询时,我的客户服务人员一直抱怨响应速度慢。
我们使用的是 Postgres 8.4.6。我开始记录慢查询,并发现了这个罪魁祸首:
SELECT COUNT(*) FROM "auth_user" WHERE UPPER("auth_user"."email"::text) LIKE UPPER(E'%deyk%')
Run Code Online (Sandbox Code Playgroud)
此查询的运行时间超过 32 秒。下面是 EXPLAIN 提供的查询计划:
QUERY PLAN
Aggregate (cost=205171.71..205171.72 rows=1 width=0)
-> Seq Scan on auth_user (cost=0.00..205166.46 rows=2096 width=0)
Filter: (upper((email)::text) ~~ '%DEYK%'::text)
Run Code Online (Sandbox Code Playgroud)
因为这是 Django ORM 从 Django Admin 应用程序生成的 Django QuerySet 生成的查询,所以我无法控制查询本身。索引似乎是合乎逻辑的解决方案。我尝试创建一个索引来加快速度,但没有任何区别:
CREATE INDEX auth_user_email_upper ON auth_user USING btree (upper(email::text))
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?我怎样才能加快这个查询?
postgresql performance index pattern-matching postgresql-8.4
在尝试访问使用 postgresql 数据库的网站时,甚至在使用 psql 实用程序或 pgadmin3 时,我突然收到此错误。
我的数据库设置为处理 150 个最大连接数:
# SHOW max_connections;
max_connections
-----------------
150
(1 row)
Run Code Online (Sandbox Code Playgroud)
重新启动我的网站所在的 ubuntu 服务器(这实际上是唯一使用连接的东西)后,我看到当前的连接量为 140:
# select count(*) from pg_stat_activity;
count
-------
140
(1 row)
Run Code Online (Sandbox Code Playgroud)
我不明白在重新启动服务器后突然有这么多连接。所以我检查了 postgresql 活动:
# SELECT * FROM pg_stat_activity;
Run Code Online (Sandbox Code Playgroud)
我看到 100 多列具有相同的精确查询,如下所示:
SELECT "reports".* FROM "reports" WHERE (("reports"."time" < '2014-06-28 13:30:42.000000' AND "reports"."unit_id" = 3192)) ORDER BY "reports"."id" DESC LIMIT 1
Run Code Online (Sandbox Code Playgroud)
更重要的是它们都具有相同的客户端地址(我的 Web 服务器)。
该 Web 服务器使用 ruby on rails,连接池为 50。即使连接池为 50,Passenger 进程/prefork apache 配置是单线程的,因此每个进程不能产生 50 个线程和 50 个数据库连接。更重要的是,这是在系统重新启动后发生的,这将所有用户都从我的 …
这是对上一个问题的评论的衍生:
使用 PostgreSQL 9.4,Recheck Cond:在EXPLAIN.
就像在EXPLAIN引用问题的输出中一样:
Run Code Online (Sandbox Code Playgroud)-> Bitmap Heap Scan on table_three (cost=2446.92..19686.74 rows=8159 width=7) Recheck Cond: (("timestamp" > (now() - '30 days'::interval)) AND (client_id > 0)) -> BitmapAnd (cost=2446.92..2446.92 rows=8159 width=0) -> Bitmap Index Scan on table_one_timestamp_idx (cost=0.00..1040.00 rows=79941 width=0) Index Cond: ("timestamp" > (now() - '30 days'::interval)) -> Bitmap Index Scan on fki_table_three_client_id (cost=0.00..1406.05 rows=107978 width=0) Index Cond: (client_id > 0)
或者在EXPLAIN ANALYZE一个简单的大表(很少work_mem)的输出中:
EXPLAIN ANALYZE …Run Code Online (Sandbox Code Playgroud) 在多对多关系上使用 join 时,结果会拆分为多行。我想做的是将连接的右侧转换为数组,因此结果是一行。
包含 3 个表的示例:
CREATE TABLE items (
id serial primary key,
title text
);
CREATE TABLE tags (
id serial primary key,
title text
);
CREATE TABLE items_tags (
item_id int references items(id),
tag_id int references tags(id),
primary key (item_id, tag_id)
);
Run Code Online (Sandbox Code Playgroud)
选择带有标签的项目时,我可以这样做:
SELECT i.id, i.title, i.title
FROM items i
INNER JOIN items_tags it
ON it.item_id = i.id
INNER JOIN tags t
ON t.id = it.tag_id;
Run Code Online (Sandbox Code Playgroud)
结果将显示为:
(1, "item n1", "sport")
(1, "item n1", "soccer")
(2, "item …Run Code Online (Sandbox Code Playgroud) 我有一个大数据库,需要从每个表中提取所有主键和外键。
我有 pgAdmin III。
有没有办法自动执行此操作而不手动查看每个表?
是否可以具有如下自定义唯一约束?假设我有两个 colssubset和type,两个字符串(尽管数据类型可能无关紧要)。
如果type是“真”,那么我希望的组合type,并subset是唯一的。否则,没有约束。我在 Debian 上使用 PostgreSQL 8.4。
postgresql index database-design constraint unique-constraint
我在 PostgreSQL 9.3 中使用了一个 PL/pgSQL 函数,里面有几个复杂的查询:
create function f1()
returns integer as
$$
declare
event tablename%ROWTYPE;
....
....
begin
FOR event IN
SELECT * FROM tablename WHERE condition
LOOP
EXECUTE 'SELECT f2(event.columnname)' INTO dummy_return;
END LOOP;
...
INSERT INTO ... FROM a LEFT JOIN b ... LEFT JOIN c WHERE ...
UPDATE T SET cl1 = M.cl1 FROM M WHERE M.pkcols = T.pkcols;
...
end
$$ language plpgsql;
Run Code Online (Sandbox Code Playgroud)
如果我跑了EXPLAIN ANALYZE f1(),我只会得到总时间,但没有细节。有没有办法可以获得函数中所有查询的详细结果?
如果函数中的查询不应该被 Postgres 优化,我也会要求解释。
例如,当我使用返回记录 ID 的查询时
INSERT INTO projects(name)
VALUES (name1), (name2), (name3) returning id;
Run Code Online (Sandbox Code Playgroud)
产生输出:
1
2
3
Run Code Online (Sandbox Code Playgroud)
这个 ids 会指向相应的插入值吗?
1 -> name1
2 -> name2
3 -> name3
Run Code Online (Sandbox Code Playgroud) 我已经在我的 PC (Win 7) 上安装了 PostgreSQL 9.1。我有一个使用login=sa和成功连接到它的小型 Java 应用程序password=""。连接有效。
但是,它被 PgAdmin III 本身拒绝。我得到:
Error connecting to the server: fe_sendauth: no password supplied
Run Code Online (Sandbox Code Playgroud)
如何使用空密码从 PgAdmin III 连接到我的数据库?
编辑
这只是一个测试,而不是生产代码。
有人可以解释VACUUMPostgreSQL 中这些类型之间的区别吗?
我阅读了文档,但它只是说FULL锁定表并FREEZE“冻结”元组。我认为那是一样的。我错了吗?
postgresql ×10
index ×3
pgadmin ×2
aggregate ×1
array ×1
constraint ×1
explain ×1
foreign-key ×1
functions ×1
insert ×1
optimization ×1
order-by ×1
performance ×1
plpgsql ×1
primary-key ×1
vacuum ×1