问题标签 [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.
sql - Order BY 将 30 毫秒的查询转换为 7120 毫秒的查询。已知的性能问题?
我有一个包含 1m 条记录的用户表:
我有以下针对 postgres 9.1 db 运行的查询:
使用 pgAdmin 3,此 SQL 需要7120 毫秒才能返回 25 行。如果我删除 'ORDER BY guest = false, fname ASC' 查询只需31ms。
我有以下索引:
有任何想法吗?谢谢!
更新解释
ruby-on-rails - 更快地搜索字段的第一个字符不匹配 [A-Za-z] 的记录?
我目前有以下内容:
fname
我可以通过他们的初始查询用户列表,如下所示:
由于以下索引,这很快:
我现在要做的是能够查询所有不以字母AZ开头的用户。我让它像这样工作:
但问题是这个查询很慢,似乎没有使用索引来加速第一次查询。关于如何优雅地使第二个查询(非 az)更快的任何建议?
我正在使用带有 rails 3.2 的 Postgres 9.1
谢谢
performance - 如何理解 EXPLAIN ANALYZE
我对查看 EXPLAIN ANALYZE 结果不是很熟悉,我的查询太慢了。我试图阅读如何解释解释查询的结果,但我仍然不知道我应该寻找什么,以及可能有什么问题。我有一种感觉,某处有一些大红灯在闪烁,我只是没看到。
所以查询很简单,看起来像这样:
结果是这样的:
一点背景知识:我在 Postgresql 9.1.6 上,在 Herokus 专用数据库上运行。我的数据库有大约 7,5Gb 的 RAM,表 cars 包含 3,1M 行,大约 2,0M 的行有 sales_state = 'onsale'。该表有 170 列。它使用的索引如下所示:
有人看到一些明显的大问题吗?
编辑:
pg_relation_size: 2058444800 pg_total_relation_size: 4900126720
pg_relation_size: 46301184
平均:636.9732567210792995
没有限制:
sql - Postgresql 计数+排序性能
我使用 postgresql 和 psycopg2 构建了一个小型库存系统。一切都很好,除了当我想创建内容的汇总摘要/报告时,由于 count()'ing 和排序,我得到了非常糟糕的性能。
数据库架构如下:
还有一些其他领域,但这些领域并不相关。
我想提取 2 个不同的报告: - 包含每个项目数量的所有主机列表,从最高到最低计数排序 - 包含每个主机数量的所有项目列表,从最高到最低计数排序
为此,我使用了 2 个查询:
具有主机计数的项目:
具有项目计数的主机:
问题是:查询在返回任何数据之前运行 5-6 秒。由于这是一个基于 Web 的应用程序,因此 6 秒是不可接受的。该数据库大量填充了大约 50k 主机、1000 个项目和 400 000 个主机/项目关系,并且在使用应用程序时(或者如果)可能会显着增加。
在玩了之后,我发现通过删除“ORDER BY count DESC”部分,两个查询都会立即执行而没有任何延迟(完成查询不到 20 毫秒)。
有什么办法可以优化这些查询,以便我可以毫不拖延地对结果进行排序?我正在尝试不同的索引,但是看到计数被计算出来,可以为此使用索引。我读过postgresql中的count()'ing很慢,但它的排序给我带来了问题......
我目前的解决方法是将上述查询作为每小时作业运行,将结果放入一个新表中,该表在计数列上有一个索引,以便快速查找。
我使用 Postgresql 9.2。
更新:按顺序查询计划:)
更新:这个问题的所有答案都非常有助于学习和理解 Postgres 的工作原理。这个问题似乎没有任何明确的解决方案,但我非常感谢您提供的所有优秀答案,我将在以后的 Postgresql 工作中使用这些答案。非常感谢你们!
sql - 每 15 分钟有效地查询一个巨大的时间序列表中的一行
我有两个表,conttagtable
(t)和contfloattable
(cf)。T 有大约 43k 行。CF拥有超过90亿。
tagindex
我在两个表的列上创建了两个表的索引。可以将此列视为 for 的唯一标识符和 for的conttagtable
外键。我没有在与另一个表相关的任何一个表上显式创建 PK 或外键,尽管此数据在逻辑上与两个表上的列相关,就像a和where a一样。数据来自微软访问转储,我不知道我是否可以相信 tagindex 是唯一的,因此不强制执行“唯一性”。conttagtable
confloattable
tagindex
conttagtable.tagindex
PRIMARY KEY
contfloattable.tagindex
FOREIGN KEY (tagindex) REFERENCES conttagtable(tagindex)
数据本身非常庞大。
我需要从contfloattable
每个. 因此,如果给定的 4000 个样本跨越 30 分钟,我需要一个 0-14 分钟范围内的样本和一个 15-30 分钟范围内的样本。15 分钟范围内的任何一个样品都是可以接受的;第一个,最后一个,随机的,随便什么。contfloattable.dateandtime
conttagtable.tagid
contfloattable
tagid
简而言之,我需要每 15 分钟获取一个样本,但每个 t.tagname 只需要一个样本。现在的样本每 5 秒记录一次,数据跨越两年。就 sql 而言,这是一个大数据问题,而且超出了我的想象。我从谷歌搜索或搜索 SO 中尝试的所有时间间隔解决方案都产生了如此长的查询时间,以至于它们不实用。
- 我的索引是否足以进行快速连接?(它们似乎是在省略时间间隔部分时)
- 我会从添加任何其他索引中受益吗?
- 实现上述目标的最佳/最快查询是什么?
这是一个包含架构和一些示例数据的 SQLFiddle:http ://sqlfiddle.com/#!1/c7d2f/2
架构:
我想看到的输出是这样的:
……等等等等……
正如 Clodoaldo 所建议的,这是我的最新尝试,有什么建议可以加快速度吗?
从上面查询计划: http: //explain.depesz.com/s/loR
sql - 带有日期时间等的 WHERE 子句的索引
我正在使用 Postgres 9.1 并且查询的执行速度非常慢。
查询:
结果:
如您所见,这大约需要 11 秒。我将如何添加索引以优化此查询性能?
sql - postgresql - pk 与唯一索引
在 PostgreSQL 9 数据库中,有一个表包含一个串行字段 X,它是一个 PK(启用了 oid)和其他字段。
将 postgres 的 pgadmin 与该表一起使用 - 查询需要 30 秒。
如果我在同一个字段 X 上添加唯一索引 - pgadmin 中的相同查询需要 3 秒。
PK 是隐式索引: http ://www.postgresql.org/docs/current/static/indexes-unique.html
那么为什么显式索引会产生影响呢?
这是一个 pgadmin 问题吗?
我是否需要 PK 字段的显式索引?
database - Postgresql 查询优化 不允许内/外连接
我得到了这个查询来优化 POSTGRESQL 9.2:
作为我学校作业的一部分。
我在各个表上创建了这些索引:items(category)
-->2ndary b+tree、bids(item_id)
-->2ndary b+tree 和categories(id)
-->primary index here,
奇怪的是,PostgreSQL 正在对我的 Items、Categories 和 Bids 表进行顺序扫描,当我设置 时enable_seqscan=off
,索引搜索结果比下面的结果更可怕。
当我在 PostgreSQL 中运行解释时,结果如下:请不要删除缩进,因为它们很重要!
请在 explain.depesz.com 上查看此计划。
我只想知道为什么会发生这种情况,即与顺序扫描相比,为什么索引会使查询变得非常慢。
编辑:我想我已经设法通过阅读 postgresql 文档发现了一些东西。Postgresql 决定对某些表(例如 bids 和 items)进行 seq 扫描,因为它预测它必须检索表中的每一行(比较实际时间之前括号中的行数和实际时间部分中的行数)。顺序扫描更适合检索所有行。好吧,在那部分什么都做不了。
我已经创建了额外的索引categories(name)
,下面的结果就是我所拥有的。它以某种方式得到了改进,但现在哈希连接被嵌套循环所取代。为什么有任何线索?
看看这里的计划是否更好。
通过在 category(id) 和items(category)
. Postgresql 使用这两个索引来获得 114062.92 成本。但是,现在 postgresql 正在与我玩游戏,不使用索引!为什么这么马车?
mysql - Postgres 等效于 MySQL 的 BENCHMARK() 函数
我正在使用 Postgresql。我想测试一个函数执行需要多少时间。由于该函数只需要几毫秒,我想在循环中调用它 1000 次以获得准确的数字。
MySQL 有一个 BENCHMARK() 函数来执行此操作。是否有等价物或者我必须编写一个带有循环的程序才能做到这一点?
postgresql - PostgreSQL 索引优化
目前我有以下 SQL Select 语句的以下指标。尽管如此,查询对我来说似乎仍然很慢(10.000 条记录)。你有什么建议?
- 索引 category_id
- 索引交付日期
- product_id、product_name 上的索引
这是我的 DDL:
和 SQL:
任何帮助,将不胜感激。
在 EXPLAIN ANALYZE 的输出下方: