问题标签 [postgresql-performance]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
ruby-on-rails - Heroku Postgres 查询速度健全性检查。我做错了吗?
我正在 Heroku 上运行一个 Rails 网站,并且正在进行一些性能分析和改进。
我想知道是否有任何有经验在 Heroku 上分析 Postgres 性能的人可以告诉我我是否在做一些明显错误的事情,或者这个数据库调用是否真的可以这么慢。
这是一个名为 Cities 的表上的 SELECT,该表有大约 3000 行。country_id 上有一个索引。
这是一张显示慢速调用分析的图像
如果您可以阅读图像,您会看到我正在调用 SELECT name, slug,... FROM "Cities" WHERE "cities"."country_id" = 151。
根据 Miniprofiler,这个调用(在 Heroku 上的生产中)花费了 14.739 秒。这个电话似乎需要 2 秒到 25 秒,这与该国拥有的城市数量(2 到 50 左右)之间存在一定的相关性。在开发中,它只需要几分之一秒。
我正在以 10 美元的计划运行 Heroku 托管的 Postgres。
现在我正在考虑通过 ajax 加载这个调用在我的页面上使用的内容,但对我来说它应该花这么长时间仍然没有意义。
有人有想法么?
作为参考,可以在 www.istorical.com 上找到该站点,此调用发生在加载 www.istorical.com/countries/russia 时
如果您确实访问了实际站点,您可能会发现加载时间并不长,这是因为此调用仅在页面的缓存过期时进行。
sql - 使用 LIMIT 1 索引 ORDER BY
我正在尝试获取表中的最新行。我有一个简单的时间戳created_at
,它被索引。当我查询ORDER BY created_at DESC LIMIT 1
时,它比我想象的要多得多(我的机器上 36k 行大约需要 50 毫秒)。
EXPLAIN -ing 声称它使用反向索引扫描,但我确认将索引更改为(created_at DESC)
不会更改查询计划器中用于简单索引扫描的成本。
如何优化此用例?
运行 postgresql 9.2.4
。
编辑:
sql - 为什么下面的连接会显着增加查询时间?
我在这里有一个星型模式,我正在查询事实表并想加入一个非常小的维度表。我无法真正解释以下内容:
这需要大约 12600 毫秒,但当然没有连接数据,所以我无法将 imp.os_id “解析”为有意义的东西,所以我添加了一个连接:
这有效地使我的查询的执行时间加倍。我的问题是,我从图片中遗漏了什么?我认为这么小的查找不会导致查询执行时间的巨大差异。
sql - 准备好的语句中空 LIKE 的性能影响
我在表格的列pg_trgm
上设置了一个 GiST 索引。name
files
准备好的语句的简化查询如下所示:
$1
参数将由%
+ 用户查询 +%
组成。由于输入也可能是一个空字符串,这可能会导致%%
.
“空” LIKE
( %%
) 是否会导致性能下降?在这种情况下我应该建立一个新的查询,还是没关系?
sql - DISTINCT INNER JOIN 慢
我已经编写了以下 PostgreSQL 查询,它可以正常工作。但是,它似乎非常慢,有时需要长达 10 秒才能返回结果。我确信我的陈述中有一些东西导致这很慢。
谁能帮助确定为什么这个查询很慢?
我将其替换NOT IN
为以下内容:
解释分析的结果:
sql - 查询计划器选择嵌套连接不准确
我从 EXPLAIN ANALYZE 得到这个
因此,预期行与实际行之间存在近 3 个数量级的差异,这导致查询非常慢。
我将 default_statistics_target 提高到 10000 并运行 VACUUM/ANALYZE 以使查询规划器与新的统计信息保持同步。如何让查询规划器选择更好的连接策略?
我正在使用 postgres 9.3.1。我所有的计划成本常数仍然是默认的,所以:
我设置了 enable_nested_loops = false 并且查询实际上并没有运行得更快。我的印象是查询计划器估计返回的行数与实际可能会导致查询计划不理想
整个查询计划如下所示:
我们有 17GB 内存
此查询的目的是查找具有用户有权访问的门票的事件。可以通过多种方式确定访问。如果用户是对给定工单具有访问权限的部门的一部分,如果用户部门是具有访问权限的部门的父级(嵌套集 lft、rgt 等)。如果整个公司都被授予这些票的访问权限,则用户可以访问。用户可以是具有访问权限的用户组的一部分。可以向用户授予对票证的个人访问权限。用户公司必须拥有门票。票证可以“冻结”或“无效”,在这种情况下用户将无权访问。如果“active_on”> 今天或“inactive_on”< 今天,则工单处于非活动状态。如果他们买票,则票不可用。hold_until > 今天
我正在运行的查询是
表:
我知道这很多,感谢您花时间查看
sql - 什么是“位图索引”?
我有一个 PostgreSQL 查询花费的时间比我想要的要长。我正在查看的输出,EXPLAIN ANALYZE
它提到了一个Bitmap Index Scan
. 我已经在网上搜索并阅读了大约 10 分钟,但我无法弄清楚:
位图索引是一种制造出来的东西——如果我在某处的某个列中添加一个真实的索引,我可以改进它——还是它是一种特定类型的真实索引?
这是我正在查询的单个表:
这是分析查询的结果。请注意,查询中有大约 3k 个不同fixin_id
的字面值(在下面省略),并且该表有 900k 行。仅计算特定时间范围内的那些行会产生 15,000 行。
ANALYZE 的结果是否告诉我需要向 fixin_id(和/或其他字段)添加索引以提高速度?或者这只是因为它的大小而“慢”?
sql - 大表更新查询慢
我正在尝试更新 order_item 中的每一行。Status 是一个新创建的列,并且必须具有 order_update 表中的最新值。一个项目可以有多个更新。
我正在使用 PostgreSQL 9.1
我有这个更新sql。
该表order_item
有 800K 记录。
该表order_update
有 500 万条记录。
我怎样才能让这个 sql 以最好的方式执行。我知道更新需要一些时间,我只想尽快更新。
我发现在 5Mil 记录上执行此 sql 时。
解释:
大约需要 6 秒。
当我在 1Mil 记录中执行相同的 sql 时:
说明:
大约需要 11 毫秒。
11 毫秒与 6 秒。为什么会有巨大的差异?
为了缩小一点,我试试这个:
然后这个:
所以 asc 和 desc 的巨大差异。
解决方案:创建索引:
更新 :
sql - 使用数据类型“文本”存储字符串有什么缺点吗?
根据PostgreSQL 文档,它们支持 3 种字符数据的数据类型:
在我的应用程序中,我遇到了一些令人不快的场景,其中插入/更新查询失败,因为要插入的所需文本超出了varchar(n)
orchar(n)
限制。
对于这种情况,改变这些列的数据类型就text
足够了。
我的问题是:
- 如果我们将每个字符存储列的数据类型概括并更改为
text
,那么在性能/内存方面是否有任何不利之处? - 如果具有数据类型的列
text
每次存储 10 个或更少的字符,我应该选择text
orvarchar(10)
吗? - 如果我去有
text
什么缺点?