小编Erw*_*ter的帖子

如何创建索引以加速对表达式的聚合 LIKE 查询?

我可能在标题中问错了问题。以下是事实:

在我们基于 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

26
推荐指数
2
解决办法
2万
查看次数

psql:致命:抱歉,已经有太多的客户了

在尝试访问使用 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 max-connections

26
推荐指数
2
解决办法
11万
查看次数

带有位图索引扫描的查询计划中的“重新检查条件:”行

这是对上一个问题的评论的衍生:

使用 PostgreSQL 9.4,Recheck Cond:EXPLAIN.

就像在EXPLAIN引用问题的输出中一样:

->  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)
Run Code Online (Sandbox Code Playgroud)

或者在EXPLAIN ANALYZE一个简单的大表(很少work_mem)的输出中:

EXPLAIN ANALYZE …
Run Code Online (Sandbox Code Playgroud)

postgresql index execution-plan postgresql-9.4

26
推荐指数
2
解决办法
1万
查看次数

将多对多连接的右侧转换为数组

在多对多关系上使用 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)

postgresql aggregate array postgresql-9.4

26
推荐指数
2
解决办法
3万
查看次数

检索所有 PK 和 FK

我有一个大数据库,需要从每个表中提取所有主键和外键。

我有 pgAdmin III。

有没有办法自动执行此操作而不手动查看每个表?

postgresql foreign-key primary-key pgadmin

25
推荐指数
3
解决办法
2万
查看次数

自定义唯一约束,仅当一列具有特定值时强制执行

是否可以具有如下自定义唯一约束?假设我有两个 colssubsettype,两个字符串(尽管数据类型可能无关紧要)。

如果type是“真”,那么我希望的组合type,并subset是唯一的。否则,没有约束。我在 Debian 上使用 PostgreSQL 8.4。

postgresql index database-design constraint unique-constraint

25
推荐指数
2
解决办法
8732
查看次数

EXPLAIN ANALYZE 不显示 plpgsql 函数内查询的详细信息

我在 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 优化,我也会要求解释。

postgresql optimization plpgsql functions explain

25
推荐指数
1
解决办法
2万
查看次数

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)

postgresql insert order-by postgresql-9.4

25
推荐指数
2
解决办法
2万
查看次数

PgAdmin III - 如何在密码为空时连接到数据库?

我已经在我的 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 连接到我的数据库?

编辑

这只是一个测试,而不是生产代码。

postgresql pgadmin

24
推荐指数
2
解决办法
6万
查看次数

真空冷冻与完全真空

有人可以解释VACUUMPostgreSQL 中这些类型之间的区别吗?

我阅读了文档,但它只是说FULL锁定表并FREEZE“冻结”元组。我认为那是一样的。我错了吗?

postgresql vacuum

24
推荐指数
2
解决办法
3万
查看次数