我有一张桌子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
我正在使用 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
如何为 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 应该使用列数据类型的默认值(就像我上面的例子一样),而不是具体指定哪个值。
假设我有这张表:
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_orderstatus、o_orderpriority或列的查询,我可以将数据类型更改为 以改进它们吗o_clerk?o_commentchar(n)text
我想弄清楚是否有一种方法可以使嵌套 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) 目前,我有一个定义如下的视图:
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) 我有一个大约 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
我在 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
如何将texts 数组转换为UUIDs数组?
我需要join在两个表之间做一个:users和projects。
该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)
但没有一个有效:
Run Code Online (Sandbox Code Playgroud)ERROR: invalid input syntax for type uuid: ""
更新
@a_horse_with_no_name 绝对正确。最好的选择应该是使用一组 UUID。
现在的问题是我如何可以改变的阵列text到阵列uuid?
该users表当前为空(0 条记录)。
我试过了
ALTER TABLE "users" ALTER COLUMN "project_ids" SET …Run Code Online (Sandbox Code Playgroud) 工单具有以下状态:
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 一起使用。
编辑:转述问题 - 我在什么时候从 varchar 切换到 text 并返回?
关于这个问题的一点背景。假设我们有 sales_orders 表,我们希望能够在订单上保留一个带有客户或销售代表评论的注释字段。它需要是可搜索的LIKE "%goldfinger's gun%"我们知道我们不会在字段中存储“战争与和平”,但同时它应该足够大以处理一两句话。
那么哪个选项是:
假设 MySQL(InnoDB) 或 PostgreSQL 用例
postgresql ×11
performance ×5
datatypes ×3
index ×3
optimization ×2
amazon-rds ×1
array ×1
cast ×1
cte ×1
ddl ×1
index-tuning ×1
insert ×1
join ×1
mysql ×1
update ×1
uuid ×1
varchar ×1