相关疑难解决方法(0)

固定宽度行会提高 PostgreSQL 读取性能吗?

我有一张桌子articles

                                                       Table "articles"
     Column     |            Type             |                     Modifiers                      | Storage  | Stats target | Description
----------------+-----------------------------+----------------------------------------------------+----------+--------------+-------------
 id             | integer                     | not null default nextval('articles_id_seq'::regclass) | plain    |              |
 user_id        | integer                     |                                                    | plain    |              |
 title          | character varying(255)      |                                                    | extended |              |
 author         | character varying(255)      |                                                    | extended |              |
 body           | text                        | default '--- []                                   +| extended |              |
                |                             | '::text                                            |          |              |
 created_at     | timestamp without time zone | …
Run Code Online (Sandbox Code Playgroud)

postgresql performance datatypes postgresql-9.4 query-performance

9
推荐指数
1
解决办法
1694
查看次数

优化大表上的 LATERAL JOIN 查询

我正在使用 Postgres 9.5。我有一个记录来自多个网站的页面点击量的表格。该表包含从 2016 年 1 月 1 日到 2016 年 6 月 30 日的大约 3200 万行。

CREATE TABLE event_pg (
   timestamp_        timestamp without time zone NOT NULL,
   person_id         character(24),
   location_host     varchar(256),
   location_path     varchar(256),
   location_query    varchar(256),
   location_fragment varchar(256)
);
Run Code Online (Sandbox Code Playgroud)

我正在尝试调整一个查询,该查询计算执行给定页面命中序列的人数。该查询旨在回答诸如“有多少人查看了主页,然后访问了帮助站点,然后查看了感谢页面”之类的问题?结果看起来像这样

?????????????????????????????????????????
?  home-page ? help site  ? thankyou    ?
?????????????????????????????????????????
? 10000      ? 9800       ?1500         ?
?????????????????????????????????????????
Run Code Online (Sandbox Code Playgroud)

请注意数字正在减少,这是有道理的,因为查看主页的 10000 人 9800 继续访问了帮助站点,而其中 1500 人继续点击了感谢页面。

3 步序列的 SQL 使用横向连接,如下所示:

SELECT 
  sum(view_homepage) AS view_homepage,
  sum(use_help) AS use_help,
  sum(thank_you) AS thank_you
FROM ( …
Run Code Online (Sandbox Code Playgroud)

postgresql performance optimization greatest-n-per-group postgresql-performance

9
推荐指数
1
解决办法
8114
查看次数

如何使用数据类型的默认值作为列默认值?

如何为 DDL 中的列指定默认值?我很确定以下方法不久前有效:

CREATE TABLE test
(
  col_1 CHAR(12) NOT NULL,
  col_2 INTEGER  NOT NULL WITH DEFAULT,
  col_3 CHAR(12) NOT NULL WITH DEFAULT
);
Run Code Online (Sandbox Code Playgroud)

我只想定义 DB 应该使用列数据类型的默认值(就像我上面的例子一样),而不是具体指定哪个值。

postgresql database-design datatypes ddl

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

列的数据类型会影响查询性能吗?

假设我有这张表:

Table "public.orders"
         Column      |     Type      | Collation | Nullable | Default 
    -----------------+---------------+-----------+----------+---------
     o_orderkey      | integer       |           | not null | 
     o_custkey       | integer       |           |          | 
     o_orderstatus   | character(1)  |           |          | 
     o_totalprice    | numeric(12,2) |           |          | 
     o_orderdate     | date          |           |          | 
     o_orderpriority | character(15) |           |          | 
     o_clerk         | character(15) |           |          | 
     o_shippriority  | integer       |           |          | 
     o_comment       | character(79) |           |          |
Run Code Online (Sandbox Code Playgroud)

如果我有涉及o_orderstatuso_orderpriority或列的查询,我可以将数据类型更改为 以改进它们吗o_clerko_commentchar(n)text

postgresql database-design optimization query-performance

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

带有嵌套 CTE 的条件插入?

我想弄清楚是否有一种方法可以使嵌套 CTE 适用于这种特殊情况。

考虑以下基于实际应用程序的(高度人为设计的)场景:有一个员工 ID 的单列表。然后是包含所有详细信息的员工属性表。(单列表背后的主要原因通常是理所当然地需要在知道实际员工的任何详细信息之前批量创建和分配新员工 ID。)

现在到手头的任务,我们要为新员工插入详细信息(即姓名),但首先我们需要检查是否已经存在具有该姓名的员工。如果是,我们将简单地返回 id,如果不是,我们将创建一个新的员工记录,然后插入详细信息,最后返回新创建的 id。

要重新创建此测试场景:

CREATE TABLE public.employee (
    id text DEFAULT gen_random_uuid(),
    PRIMARY KEY (id)
);

CREATE TABLE public.employee_details (
    employee_id text,
    name text,
    PRIMARY KEY (employee_id),
    FOREIGN KEY (employee_id) REFERENCES public.employee(id)
);
Run Code Online (Sandbox Code Playgroud)

我试图敲定的查询如下所示。

with 
e as 
    (select name, employee_id from employee_details where name = 'jack bauer'), 

i as (insert into employee_details (name, employee_id) 
    select 'jack bauer', 
        (with a as (insert into employee values(default) RETURNING id) select a.id from a)
    where not exists …
Run Code Online (Sandbox Code Playgroud)

postgresql insert cte postgresql-10

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

如何使这个查询使用我的多列索引?

目前,我有一个定义如下的视图:

                       View "public.customer_list"
  Column   |          Type           | Modifiers | Storage  | Description 
-----------+-------------------------+-----------+----------+-------------
 id        | bigint                  |           | plain    | 
 name      | character varying(100)  |           | extended | 
 street    | character varying(100)  |           | extended | 
 zip       | character varying(10)   |           | extended | 
 city      | character varying(100)  |           | extended | 
 country   | character varying(3)    |           | extended | 
 phone     | character varying(100)  |           | extended | 
 mail      | character varying(100)  |           | extended | 
 rating    | integer                 | …
Run Code Online (Sandbox Code Playgroud)

postgresql performance index postgresql-performance

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

SELECT 查询中未使用索引

我有一个大约 3.25M 行的表格,在 Postgres 9.4.1 中遵循以下格式

CREATE TABLE stats
(
    id serial NOT NULL,
    type character varying(255) NOT NULL,
    "references" jsonb NOT NULL,
    path jsonb,
    data jsonb,
    "createdAt" timestamp with time zone NOT NULL,
    CONSTRAINT stats_pkey PRIMARY KEY (id)
)
WITH (
    OIDS=FALSE
);
Run Code Online (Sandbox Code Playgroud)

type是一个简单的字符串长度不超过50个字符。

references列是一个带有键值列表的对象。基本上任何简单的键值列表,只有 1 级深,值总是字符串。它可能是

{
    "fruit": "plum"
    "car": "toyota"
}
Run Code Online (Sandbox Code Playgroud)

或者它可能是

{
    "project": "2532"
}
Run Code Online (Sandbox Code Playgroud)

createdAt时间戳并不总是从数据库中生成的(但它会默认如果值不被提供)

我目前使用的表格只有测试数据。在此数据中,每一行都有一个project键作为参考。所以有 3.25M 行有一个项目键。project引用正好有 400,000 个不同的值。该type字段只有 5 个不同的值,在生产中可能不会超过几百个。

所以我试图索引表以快速执行以下查询: …

postgresql performance index database-design postgresql-performance

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

提高大表的 UPDATE 性能

我在 Amazon RDS(2vCPU,8 GB RAM)上使用 Postgres 9.5。
我使用 pganalyze 来监控我的表现。
我在数据库中有大约 20 万条记录。

在我的仪表板中,我看到以下查询的平均执行时间为 28 秒和 11 秒:

UPDATE calls SET ... WHERE calls.uuid = ?   telephonist 28035.41    0.01    100%    0.03%

UPDATE calls SET sip_error = ? WHERE calls.uuid = ? telephonist 11629.89    0.44    100%    0.69%
Run Code Online (Sandbox Code Playgroud)

我已经尝试VACUUM、发现并清理了 7,670 个死行。
任何想法如何提高UPDATE性能?这是查询:

UPDATE calls SET X=Y WHERE calls.uuid = 'Z'
Run Code Online (Sandbox Code Playgroud)

如何改进上述查询?我可以添加另一个字段吗?例子:

UPDATE calls SET X=Y WHERE calls.uuid = 'Z' AND calls.campaign = 'W'
Run Code Online (Sandbox Code Playgroud)

该列uuid未编入索引。
https://www.tutorialspoint.com/postgresql/postgresql_indexes.htm建议不建议将索引用于 …

postgresql performance index-tuning update amazon-rds postgresql-performance

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

将文本数组转换为 UUID 数组

如何将texts 数组转换为UUIDs数组?

我需要join在两个表之间做一个:usersprojects

users表有一个名为的数组字段,project_ids其中包含作为文本的项目 ID。

projects表有一个名为 的 UUID 字段id

我最初的想法是一个查询看起来像:

SELECT * FROM projects
JOIN users ON
projects.id = ANY(users.project_ids)
Run Code Online (Sandbox Code Playgroud)

但这不起作用,因为users.project_ids不是,UUID所以我试过:

projects.id = ANY(users.project_ids::uuid[])
Run Code Online (Sandbox Code Playgroud)

乃至:

projects.id = ANY(ARRAY[users.project_ids]::uuid[])
Run Code Online (Sandbox Code Playgroud)

但没有一个有效:

ERROR: invalid input syntax for type uuid: ""
Run Code Online (Sandbox Code Playgroud)

更新

@a_horse_with_no_name 绝对正确。最好的选择应该是使用一组 UUID。

现在的问题是我如何可以改变的阵列text到阵列uuid

users表当前为空(0 条记录)。

我试过了

ALTER TABLE "users" ALTER COLUMN "project_ids" SET …
Run Code Online (Sandbox Code Playgroud)

postgresql join cast array uuid

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

低基数字段:整数或字符串

工单具有以下状态:

new
in_progress
on_hold
closed
Run Code Online (Sandbox Code Playgroud)

我可以创建ticket.status一个字符串 ( on_hold) 或一个唯一的 int( 2)。它被索引。

整数优点:索引中的最小尺寸

Int con:BI 和不断发展的模式的清晰度低(3与 相比closed

String pro:清晰的数据导航

String con:占用更多空间来索引,对于相同的 RAM 性能较低

我想如果字符串索引的基数较低,它不会比 int 索引占用太多空间。如果该字段的基数较低并且不是复合索引的一部分,则选择整数是否过早优化?

我将 Postgres 与 SQLAlchemy、Python ORM 一起使用。

postgresql index database-design datatypes

3
推荐指数
1
解决办法
1304
查看次数

哪个更有效:文本 (765) 或 varchar (765) 来存储自由格式的可搜索描述?

编辑:转述问题 - 我在什么时候从 varchar 切换到 text 并返回?

关于这个问题的一点背景。假设我们有 sales_orders 表,我们希望能够在订单上保留一个带有客户或销售代表评论的注释字段。它需要是可搜索的LIKE "%goldfinger's gun%"我们知道我们不会在字段中存储“战争与和平”,但同时它应该足够大以处理一两句话。

那么哪个选项是:

  • 读取速度更快?
  • 更擅长存储数据?
  • 更适合全文搜索?
  • 索引?

假设 MySQL(InnoDB) 或 PostgreSQL 用例

mysql postgresql full-text-search varchar

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