performance - PSQL = 快速,远程 sql = v.slow

标签 performance postgresql npgsql pgadmin psql

好的,我明白这个问题有点含糊,但经过一天的谷歌搜索,我一无所获,我们将不胜感激,我愿意尝试任何事情。

问题是我们有一个 PostgreSQL 数据库,它在特定表中有大约 10-15 百万行。

我们正在根据表中的 DateTime 字段对所有列进行选择。没有连接,只有带有 where 子句的标准选择(时间 >= x 和时间 <= y)。字段上也有索引...

当我在本地机器上使用 psql 执行 sql 时,它运行了大约 15-20 秒,并带回了 50 万行,其中之一是一个文本字段,每行包含大量数据(一个程序堆栈跟踪)。当我们使用相同的 sql 并通过 Npgsql 或 Windows 上的 pgadmin III 运行它时,大约需要 2 分钟。

这让我认为这是一个网络问题。我在查询运行时检查了机器,它没有使用大量内存或 CPU,网络速度可以忽略不计。

我也阅读了 Postgres 站点上关于内存设置的建议。包括更新 shmmax 和 shmall。

它是 Ubuntu 10.04、PSQL 8.4、4GB RAM、2.8GHz Quad Xeon(虚拟但专用资源)。该机器也有它的 Windows 对应版本(2008 R2、SS2008),但已关闭。使用具有相同模式和数据的 SS,查询在大约 10-15 秒内返回,我知道这不是直接比较,但想证明这不是磁盘性能问题。

所以问题是……有什么建议吗?是否有任何我应该更改的网络设置?我错过了什么吗?我不能提供太多关于数据库的信息,但这里有一个 EXPLAIN ANALYZE 被混淆了......

Index Scan using "IDX_column1" on "table1"  (cost=0.00..45416.20 rows=475130 width=148) (actual time=0.025..170.812 rows=482266 loops=1)
Index Cond: (("column1" >= '2011-03-14 00:00:00'::timestamp without time zone) AND ("column1" <= '2011-03-14 23:59:59'::timestamp without time zone))
Total runtime: 196.898 ms

最佳答案

尝试在 psql 中将 cursor_tuple_fraction 设置为 1,看看它是否改变了结果。如果是这样,那么与获得全部结果相比,优化者可能会根据仅获得前 10% 左右的结果来选择更好的计划。 Istr psql 使用游标逐段获取结果,而不是“firehose”executequery 方法。

如果是这种情况,它不会直接指向解决方案,但您需要调整您的规划器设置,至少如果您可以在 psql 中重现该行为,那么可能更容易看到差异和测试更改。

关于performance - PSQL = 快速,远程 sql = v.slow,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5421177/

相关文章:

postgresql - 后端postgres的测试策略

postgresql - 如何减少具有有序结果的 postgresql IN 查询的索引扫描时间?

algorithm - 最大产品前缀字符串

Mysql COUNT VS num rows 性能

PostgreSQL 9.6 : Query specific ranges of a JSONB array

.net - 当从 .NET 中访问 PostgreSQL 时,是否存在阻止 Npgsql 提供多个并发读取器的内在限制?

Dapper 使用 NodaTime Npgsql Plugin 的 ZonedDateTime 映射

c# - EF Core 3.0 替换 IMutableIndex.Npgsql() 方法

Ruby - 如果为真则返回值或执行任意代码的最简洁方法

python - Python 中替代开关的性能差异