Questions tagged «postgresql-performance»

PostgreSQL查询的性能问题

4
测量PostgreSQL表行的大小
我有一个PostgreSQL表。select *是很慢的,select id而又好又快。我认为这可能是因为行的尺寸很大,并且运输需要一段时间,或者可能是其他一些因素。 我需要所有字段(或几乎所有字段),因此仅选择一个子集并不是快速解决方案。选择我想要的字段仍然很慢。 这是我的表架构减去名称: integer | not null default nextval('core_page_id_seq'::regclass) character varying(255) | not null character varying(64) | not null text | default '{}'::text character varying(255) | integer | not null default 0 text | default '{}'::text text | timestamp with time zone | integer | timestamp with time …

6
如何有效地获取“最近对应的行”?
我有一个必须非常常见的查询模式,但是我不知道如何为它编写有效的查询。我想查找与“最近日期不晚于”另一个表的行相对应的表的行。 例如,我有一张桌子,inventory它代表我当天持有的库存。 date | good | quantity ------------------------------ 2013-08-09 | egg | 5 2013-08-09 | pear | 7 2013-08-02 | egg | 1 2013-08-02 | pear | 2 还有一张表,上面写着“价格”,该表保存了某天的商品价格 date | good | price -------------------------- 2013-08-07 | egg | 120 2013-08-06 | pear | 200 2013-08-01 | egg | 110 …

2
WHERE子句是否按其编写顺序应用?
我正在尝试优化查询到一个大表(3700万行)的查询,并且对在查询中执行操作的顺序有疑问。 select 1 from workdays day where day.date_day >= '2014-10-01' and day.date_day <= '2015-09-30' and day.offer_id in ( select offer.offer_day from offer inner join province on offer.id_province = province.id_province inner join center cr on cr.id_cr = province.id_cr where upper(offer.code_status) <> 'A' and province.id_region in ('10' ,'15' ,'21' ,'26' ,'31' , …

2
使用大IN优化Postgres查询
该查询获取您关注的人创建的帖子列表。您可以追踪的人数不受限制,但是大多数人追踪的人数<1000。 使用这种查询方式,明显的优化将是缓存"Post"id,但是不幸的是我现在没有时间。 EXPLAIN ANALYZE SELECT "Post"."id", "Post"."actionId", "Post"."commentCount", ... FROM "Posts" AS "Post" INNER JOIN "Users" AS "user" ON "Post"."userId" = "user"."id" LEFT OUTER JOIN "ActivityLogs" AS "activityLog" ON "Post"."activityLogId" = "activityLog"."id" LEFT OUTER JOIN "WeightLogs" AS "weightLog" ON "Post"."weightLogId" = "weightLog"."id" LEFT OUTER JOIN "Workouts" AS "workout" ON "Post"."workoutId" …

2
如何处理由于范围类型完全相等而导致的错误查询计划?
我正在执行更新,其中我需要对tstzrange变量进行完全相等的处理。约100万行被修改,查询耗时约13分钟。的结果EXPLAIN ANALYZE可以在此处看到,实际结果与查询计划者估算的结果有很大不同。问题在于索引扫描开启t_range期望返回一行。 这似乎与以下事实有关:范围类型的统计信息与其他类型的统计信息存储方式不同。综观pg_stats为列图,n_distinct是-1和其它字段(例如most_common_vals,most_common_freqs)是空的。 但是,必须在t_range某处存储统计信息。一个非常相似的更新,其中我在t_range上使用“内”而不是完全相等,需要大约4分钟的时间来执行,并且使用完全不同的查询计划(请参阅此处)。第二个查询计划对我来说很有意义,因为将使用临时表中的每一行以及历史记录表的大部分。更重要的是,查询计划人员为上的过滤器预测了大约正确的行数t_range。 的分布t_range有点不寻常。我正在使用此表存储另一个表的历史状态,并且对另一个表的更改会在大型转储中一次全部发生,因此没有许多不同的值t_range。以下是与的每个唯一值相对应的计数t_range: t_range | count -------------------------------------------------------------------+--------- ["2014-06-12 20:58:21.447478+00","2014-06-27 07:00:00+00") | 994676 ["2014-06-12 20:58:21.447478+00","2014-08-01 01:22:14.621887+00") | 36791 ["2014-06-27 07:00:00+00","2014-08-01 07:00:01+00") | 1000403 ["2014-06-27 07:00:00+00",infinity) | 36791 ["2014-08-01 07:00:01+00",infinity) | 999753 t_range以上不同的计数已经完成,因此基数约为3M(其中1M会受到任一更新查询的影响)。 为什么查询1的性能比查询2差得多?就我而言,查询2是一个很好的替代品,但是如果确实需要精确的范围相等性,我如何才能使Postgres使用更智能的查询计划? 带索引的表定义(删除不相关的列): Column | Type | Modifiers ---------------------+-----------+------------------------------------------------------------------------------ history_id | integer | not null default nextval('gtfs_stop_times_history_history_id_seq'::regclass) t_range …


1
带日期的索引优化
此问题是从Stack Overflow 迁移而来的,因为可以在Database Administrators Stack Exchange上回答。 迁移 7年前。 我在PostgreSQL 9.0.8中有一个很大的对象表(15M +行),我想查询该表中的过时字段。 我想将查询除以数百万,以实现可伸缩性和并发性,并且我想获取几天前带有update_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 尝试#2 EXPLAIN ANALYZE SELECT count(*) FROM objects WHERE ((date(now()) - (date(updated_at)) > …

1
索引:如果节点数相同,则整数vs字符串性能
我正在使用PostgreSQL(9.4)数据库在Ruby on Rails中开发应用程序。在我的用例中,表中的列将被非常频繁地查找,因为应用程序的重点是在模型上搜索非常特定的属性。 我目前正在决定是使用一种integer类型还是只使用典型的字符串类型(例如character varying(255),Rails中的默认字符串类型)作为列,因为我不确定索引的性能会有什么不同。 这些列是枚举。对于具有的可能值的数量,它们具有固定的大小。大多数枚举长度不超过5,这意味着该索引在应用程序的整个生命周期中或多或少是固定的;因此,整数和字符串索引的节点数将相同。 但是,将被索引的字符串可能长约20个字符,这在内存中大约是整数的5倍(如果整数是4个字节,并且字符串是每个字符1个字节的纯ASCII,则成立)。我不知道数据库引擎怎么做索引查找窗口,但如果它需要“扫描”的字符,直到它匹配准确,那么在本质上这意味着该字符串查找就超过5倍的整数查找速度较慢; 直到匹配整数查找为止的“扫描”将是4个字节而不是20个字节。这就是我的想象: 查找值为(整数)4: 正在扫描.........................找到| 正在获取记录... | BYTE_1 | BYTE_2 | BYTE_3 | BYTE_4 | BYTE_5 | BYTE_6 | BYTE_7 | BYTE_8 | ... | 查找值是(字符串)“ some_val”(8个字节): 扫描................................................. ....................................发现| 正在获取记录... | BYTE_1 | BYTE_2 | BYTE_3 | BYTE_4 | BYTE_5 | BYTE_6 | BYTE_7 | …


1
在仅接收INSERT的表上运行VACUUM是否值得?
在2015年的re:Invent谈话中,AWS提到,不仅应在更新或删除之后运行真空,而且还应在插入之后运行真空。这是演讲的相关部分: http://www.youtube.com/watch?v=tZXp19q8RFo&t=16m2s 假设即使块仅接收插入,也必须对其进行一些清理,并且可以在第一次选择块时(降低读取速度)或在真空期间进行清理。这是真的吗?如果是,那么到底必须执行什么清理工作?

1
log_min_duration_statement设置被忽略
我Postgresql 9.1在Ubuntu上运行。确切的Postgresql版本9.1+129ubuntu1如我的软件包管理器所示。 我有2个正在积极使用的数据库,它们是从远程服务器使用的。 我希望记录执行时间较长的查询。所以我在/etc/postgresql/9.1/main/postgresql.conf文件中设置以下参数 log_min_duration_statement = 10000 log_statement = 'mod' 因此Postgresql将记录超过10秒的查询。 但是当我reload使用postgres配置时,Postgresql开始记录每个适合log_statement值的查询。我将持续时间设置为100秒以确保 log_min_duration_statement = 100000 但是Postgresql会记录所有适合log_statement值的查询,无论log_min_duration_statement值如何。 设置log_statement为none似乎停止记录。 我有什么想念的配置吗?

1
为什么这个LEFT JOIN的表现比LEFT JOIN LATERAL差很多?
我有以下表格(来自Sakila数据库): 电影:film_id是pkey 演员:actor_id是pkey film_actor:film_id和actor_id是影片/演员的键 我正在选择一部特定的电影。对于这部电影,我还希望所有演员都参与该电影。我对此有两个查询:一个带有a LEFT JOIN和一个带有a LEFT JOIN LATERAL。 select film.film_id, film.title, a.actors from film left join ( select film_actor.film_id, array_agg(first_name) as actors from actor inner join film_actor using(actor_id) group by film_actor.film_id ) as a on a.film_id = film.film_id where film.title = 'ACADEMY DINOSAUR' order by film.title; select film.film_id, …

2
在PostgreSQL中使用GIN索引时如何加快ORDER BY排序?
我有一个这样的表: CREATE TABLE products ( id serial PRIMARY KEY, category_ids integer[], published boolean NOT NULL, score integer NOT NULL, title varchar NOT NULL); 一个产品可以属于多个类别。category_ids列包含所有产品类别的ID列表。 典型查询如下所示(始终搜索单个类别): SELECT * FROM products WHERE published AND category_ids @> ARRAY[23465] ORDER BY score DESC, title LIMIT 20 OFFSET 8000; 为了加快速度,我使用以下索引: CREATE INDEX idx_test1 ON products …

2
大表中索引扫描缓慢
使用PostgreSQL 9.2时,我在相对较大的表(200+百万行)上的慢查询遇到了麻烦。我没有尝试任何疯狂的事情,只是增加了历史价值。以下是查询和查询计划输出。 我的表格布局: Table "public.energy_energyentry" Column | Type | Modifiers -----------+--------------------------+----------------------------------------------------------------- id | integer | not null default nextval('energy_energyentry_id_seq'::regclass) prop_id | integer | not null timestamp | timestamp with time zone | not null value | double precision | not null Indexes: "energy_energyentry_pkey" PRIMARY KEY, btree (id) "energy_energyentry_prop_id" btree (prop_id) …

2
多列vs少表-性能明智
是的,我知道数据规范化应该是我的首要任务。 我有一个表,65列存储与列车辆数据:used_vehicle,color,doors,mileage,price等等,总共65。 现在,我可以除以和有一个Vehicle表,VehicleInterior,VehicleExterior,VehicleTechnical,VehicleExtra(全一到一个与主Vehicle表)。 假设我有大约500万行(车辆)。 在SELECT带有WHERE子句的情况下:搜索效果会更好(两种情况至少都在上索引IDs): Vehicle 65列的表格或 Vehicle表与JOINS其他四个表(均具有500万行)一起返回与Vehicle?相关的所有数据 (根据数据库引擎,考虑PostgreSQL和/或MySQL)。 真的很欣赏您以前的经验中得到的任何详细见解吗?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.