相关疑难解决方法(0)

在 PostgreSQL 中使用索引

我有几个关于在 PostgreSQL 中使用索引的问题。我有一个Friends带有以下索引的表:

   Friends ( user_id1 ,user_id2) 
Run Code Online (Sandbox Code Playgroud)

user_id1并且user_id2user表的外键

  1. 这些是等价的吗?如果不是,那为什么?

    Index(user_id1,user_id2) and Index(user_id2,user_id1)
    
    Run Code Online (Sandbox Code Playgroud)
  2. 如果我创建主键(user_id1,user_id2),它会自动为它创建索引吗?

    如果第一个问题中的索引不相等,那么在上面的主键命令上创建了哪个索引?

postgresql index primary-key

85
推荐指数
5
解决办法
3万
查看次数

日期索引优化

我在 PostgreSQL 9.0.8 中有一个很大的对象表(15M+ 行),我想查询过时的字段。

出于可扩展性和并发性的目的,我想将查询除以数百万,并且我想获取具有几天前日期的 updated_at 字段的所有数据。

我已经在 100 万个 ID 上尝试了许多索引和查询,但使用 Heroku 的 Ronin 硬件似乎无法在 100 秒内获得性能。

我正在寻找我尚未尝试使其尽可能高效的建议。

尝试 #1

 EXPLAIN ANALYZE SELECT count(*) FROM objects
 WHERE (date(updated_at)) < (date(now())-7) AND id >= 5000001 AND id < 6000001;
 INDEX USED: (date(updated_at),id)
 268578.934 ms
Run Code Online (Sandbox Code Playgroud)

尝试 #2

 EXPLAIN ANALYZE SELECT count(*) FROM objects
 WHERE ((date(now()) - (date(updated_at)) > 7)) AND id >= 5000001 AND id < 6000001;
 INDEX USED: primary key
 335555.144 ms
Run Code Online (Sandbox Code Playgroud)

尝试 #3

 EXPLAIN ANALYZE SELECT count(*) FROM …
Run Code Online (Sandbox Code Playgroud)

postgresql performance index partitioning postgresql-performance

32
推荐指数
1
解决办法
5万
查看次数

对大量重复值使用什么索引?

让我们做几个假设:

我有一个看起来像这样的表:

 a | b
---+---
 a | -1
 a | 17
  ...
 a | 21
 c | 17
 c | -3
  ...
 c | 22
Run Code Online (Sandbox Code Playgroud)

关于我的套装的事实:

  • 整个表的大小是 ~ 10 10行。

  • 我有 ~ 100k 行,列中有值aa其他值类似(例如c)。

  • 这意味着在“a”列中有大约 100k 个不同的值。

  • 我的大多数查询都会读取 a 中给定值的全部或大部分值,例如select sum(b) from t where a = 'c'.

  • 该表的编写方式使得连续值在物理上接近(要么按顺序写入,要么我们假设CLUSTER已在该表和列上使用a)。

  • 该表很少更新,我们只关心读取速度。

  • 该表相对较窄(比如每个元组约 25 个字节,+ 23 个字节的开销)。

现在的问题是,我应该使用什么样的索引?我的理解是:

  • BTree我的问题是 BTree 索引会很大,因为据我所知它会存储重复值(它必须这样做,因为它不能假设表是物理排序的)。如果 BTree 很大,我最终不得不读取索引和索引指向的表部分。(我们可以使用fillfactor = 100来稍微减小索引的大小。)

  • BRIN …

postgresql performance index clustered-index postgresql-9.6 query-performance

15
推荐指数
2
解决办法
8735
查看次数

寻找最长前缀的算法

我有两张桌子。

第一个是带前缀的表

code name price
343  ek1   10
3435 nt     4
3432 ek2    2
Run Code Online (Sandbox Code Playgroud)

二是带有电话号码的通话记录

number        time
834353212     10
834321242     20
834312345     30
Run Code Online (Sandbox Code Playgroud)

我需要编写一个脚本,从每条记录的前缀中找到最长的前缀,并将所有这些数据写入第三个表,如下所示:

 number        code   ....
 834353212     3435
 834321242     3432
 834312345     343
Run Code Online (Sandbox Code Playgroud)

对于数字 834353212,我们必须修剪 '8',然后从前缀表中找到最长的代码,即 3435。
我们必须始终先删除 '8',并且前缀必须在开头。

我很久以前以非常糟糕的方式解决了这个任务。它是糟糕的 perl 脚本,它对每条记录进行大量查询。这个脚本:

  1. 从调用表中取一个数字,在循环中从 length(number) 到 1 => $prefix 做子串

  2. 执行查询: select count(*) from prefixes where code like '$prefix'

  3. 如果计数> 0,则取第一个前缀并写入表

第一个问题是查询计数 - 它是call_records * length(number). 第二个问题是LIKE表达。恐怕那些很慢。

我试图通过以下方式解决第二个问题:

CREATE EXTENSION pg_trgm;
CREATE INDEX prefix_idx ON prefix USING …
Run Code Online (Sandbox Code Playgroud)

postgresql performance pattern-matching postgresql-9.1 query-performance

11
推荐指数
1
解决办法
8904
查看次数

UNION ALL 子句的结果是否始终按顺序附加?

根据标准 SQL UNION/UNION ALL不保证没有外部ORDER BY子句的任何特定排序顺序 - 就像 SQL 中几乎没有任何地方不保证排序顺序一样ORDER BY

然而,Postgres 对 的普通情况使用“附加”步骤UNION ALL,因此第一个分支的结果(即使在其分区中未排序)总是出现在下一个分支之前,等等。Postgres 只是按照给定的顺序附加每个分支的结果。这与以下LIMIT条款特别相关:

SELECT 1 FROM tbl  -- or any complex query
UNION ALL
SELECT 2
LIMIT  1
Run Code Online (Sandbox Code Playgroud)

显然这不适用于UNION(without ALL)。但除此之外,我从未见过 Postgres 无序返回,即上述查询中的“2”SELECT ,而第一个查询也会返回行。即使第一站的费用极其昂贵,也不会。

我过去曾对这种行为进行过查询。现在我遇到了一个说法, Postgres 可能会在这里返回无序的行,但没有实际证据证实。

当前的Postgres 手册对此事有这样的说法:

UNION有效地将 的结果附加query2到 的结果query1(尽管不能保证这是实际返回行的顺序)。此外,它还从结果中消除重复行,其方式与 DISTINCT, except相同UNION ALL

这还不清楚。引用的顺序是否适用于子句列表SELECT,或每个子句中的行,还是仅适用于返回的集合?另外,UNION ALL …

postgresql order-by union

10
推荐指数
1
解决办法
7301
查看次数

GROUP BY 一列,同时在 PostgreSQL 中按另一列排序

我怎么能在GROUP BY一个列中排序,而按另一列排序。

我正在尝试执行以下操作:

SELECT dbId,retreivalTime 
    FROM FileItems 
    WHERE sourceSite='something' 
    GROUP BY seriesName 
    ORDER BY retreivalTime DESC 
    LIMIT 100 
    OFFSET 0;
Run Code Online (Sandbox Code Playgroud)

我要选择的最后一个从FileItems / N /项,按降序排列,与过滤行DISTINCT的值seriesName。上面的查询出错了ERROR: column "fileitems.dbid" must appear in the GROUP BY clause or be used in an aggregate function。我需要该dbid值以便然后获取此查询的输出,并将JOIN其放在源表上以获取我所在的其余列。

请注意,这基本上是以下问题的格式塔,为了清楚起见,删除了许多无关的细节。


原始问题

我有一个要从 sqlite3 迁移到 PostgreSQL 的系统,因为我已经在很大程度上超出了 sqlite:

    SELECT
            d.dbId,
            d.dlState,
            d.sourceSite,
        [snip a bunch of rows]
            d.note

    FROM FileItems AS d
        JOIN
            ( …
Run Code Online (Sandbox Code Playgroud)

postgresql performance postgresql-9.3 greatest-n-per-group query-performance

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

如何优化各种类型的 MySQL 查询索引

我有一个 INNODB 表levels

+--------------------+--------------+------+-----+ -------+-------+
| 领域 | 类型 | 空 | 钥匙 | 默认 | 额外 |
+--------------------+--------------+------+-----+ -------+-------+
| 身份证 | 整数(9) | 否 | PRI | 空 | |
| 级别名称 | varchar(20) | 否 | | 空 | |
| 用户 ID | 整数(10) | 否 | | 空 | |
| 用户名 | varchar(45) | 否 | | 空 | |
| 评级 | 十进制(5,4) | 否 | | 0.0000 | |
| …

mysql innodb performance optimization index-tuning query-performance

8
推荐指数
1
解决办法
443
查看次数

过滤数组 text[] 并按时间戳排序

描述

Linux 上的 PostgreSQL 9.6,tags_tmp表大小~ 30 GB(1000 万行),tags是一个text[]并且只有 6 个值。

tags_tmp(id int, tags text[], maker_date timestamp, value text)
Run Code Online (Sandbox Code Playgroud)
tags_tmp(id int, tags text[], maker_date timestamp, value text)
Run Code Online (Sandbox Code Playgroud)

我需要使用 filter ontagsorder byon检索数据maker_date desc。我可以在两tags & maker_date desc列上创建索引吗?

如果没有,你能提出其他想法吗?

查询示例

select id, tags, maker_date, value
from tags_tmp
where  tags && array['a','b']
order by maker_date desc
limit 5 offset 0
Run Code Online (Sandbox Code Playgroud)

SQL 代码:

create index idx1 on tags_tmp using gin (tags);
create …
Run Code Online (Sandbox Code Playgroud)

postgresql performance order-by index-tuning postgresql-performance

8
推荐指数
1
解决办法
6302
查看次数

为什么添加 LIMIT 200 会导致查询变慢?

我正在尝试调试 PostgreSQL 9.1.13 数据库上的慢查询,我有点不知所措。ORM 框架生成的确切查询是:

SELECT "core_product"."sales_price", "core_product"."recommended_price", "core_productgroup"."name", "core_product"."number", "core_product"."name", "core_product"."description", "core_product"."cost_price", "core_product"."bar_code", "core_product"."accessible"
FROM "core_product" INNER JOIN "core_productgroup" ON ( "core_product"."product_group_id" = "core_productgroup"."id" )
WHERE "core_productgroup"."company_id" = 1056
ORDER BY "core_product"."id" ASC
LIMIT 200;
Run Code Online (Sandbox Code Playgroud)

此查询需要 28 秒才能返回 200 行,这对于我们的用例来说太慢了。

首次尝试了解性能瓶颈可能在哪里。我首先尝试删除LIMIT 200预期它会更慢。但是没有LIMIT 200查询只需要 2 秒就返回大约 293000 行。

如何更快地返回所有 293000 个匹配行而不是仅返回前 200 行?

我尝试使用EXPLAIN查看两个查询的查询计划有何不同。事实证明,这两个几乎相同的查询具有完全不同的查询计划。与LIMIT

                                                   QUERY PLAN                                                   
----------------------------------------------------------------------------------------------------------------
 Limit  (cost=10.69..52229.70 rows=200 width=76)
   ->  Nested Loop  (cost=10.69..17054740.55 rows=65320 width=76)
         Join Filter: (core_product.product_group_id = core_productgroup.id) …
Run Code Online (Sandbox Code Playgroud)

postgresql

7
推荐指数
2
解决办法
4614
查看次数

如何通过许多重复的 UNION 子查询来减少查询大小?

我使用 Postgres 13 并使用以下 DDL 定义了一个表:

CREATE TABLE item_codes (
    code    bytea                    NOT NULL,
    item_id bytea                    NOT NULL,
    time    TIMESTAMP WITH TIME ZONE NOT NULL,
    PRIMARY KEY (item_id, code)
);

CREATE INDEX ON item_codes (code, time, item_id);
Run Code Online (Sandbox Code Playgroud)

我使用以下查询:

SELECT DISTINCT time, item_id
FROM (
      (SELECT time, item_id
       FROM item_codes
       WHERE code = '\x3965623166306238383033393437613338373162313934383034366139653239'
       ORDER BY time, item_id
       LIMIT 100)
       UNION ALL
      (SELECT time, item_id
       FROM item_codes
       WHERE code = '\x3836653432356638366638636338393364373935343938303233343363373561'
       ORDER BY time, item_id
       LIMIT 100)
     ) AS items
ORDER …
Run Code Online (Sandbox Code Playgroud)

postgresql execution-plan union query-performance postgresql-performance

6
推荐指数
1
解决办法
608
查看次数