如果postgres的性能低,我应该选择哪个db

时间:2008-10-15 16:07:19

标签: database performance postgresql

在支持5000多名用户的网络应用中,postgres正在成为瓶颈。

添加新用户需要1分钟以上。(即使在优化后和Win 2k3上)

那么,作为一个设计问题,哪个其他DB可能会更好?

12 个答案:

答案 0 :(得分:49)

最有可能的是,它不是PostgreSQL,而是你的设计。换鞋很可能不会让你成为更好的舞者。

你知道什么导致缓慢吗?是争论,更新索引的时间,寻求时间? 是否所有5000个用户都试图在尝试插入第5001个用户的同一时间写入用户表?那,我相信会导致问题。您可能必须使用调整为处理极端并发的内容,例如Oracle。

MySQL(我被告知)可以进行优化,以便比PostgreSQL更快地进行读取,但是在它们支持的#transaction / sec方面,两者都非常快,并且听起来不像是你的问题。


P.S。 我们在评论中对一个不同的答案进行了一些讨论 - 请注意,世界上一些最大的,存储方面的数据库是使用Postgres实现的(尽管它们倾向于调整引擎的内部)。 Postgres可以非常好地扩展数据大小,并发性能比大多数更好,并且在使用它时可以非常灵活。

我希望有更好的答案,在技术发明30年后,我们应该能够让用户对系统的了解不那么详细,以使其顺利运行。但是,我所知道的所有产品都需要广泛的思考和调整。我想知道StackOverflow的创建者是否可以分享他们如何处理数据库并发和可伸缩性?他们正在使用SQLServer,我知道的很多。


P.P.S。 因此,如果有机会的话,我昨天首先陷入甲骨文的并发问题。我并不完全确定我是对的,不是DBA,但是这些人解释的是这样的:我们有大量的进程连接到数据库并检查系统字典,这显然会强制对它进行短暂锁定尽管这只是一个阅读。解析查询会做同样的事情。所以我们(在具有1000个对象的多tera系统上)有很多强制等待时间,因为进程彼此锁定在系统之外。我们的系统字典也过大,因为它包含每个分区的所有信息的单独副本,每个分区可以有数千个。这与PostgreSQL并不真正相关,但重要的是 - 除了检查你的设计之外,确保你的查询使用绑定变量并重新使用,并且共享资源的压力很小。

答案 1 :(得分:9)

请更改运行Postgres的操作系统 - Windows端口,虽然对扩展用户群非常有用,is still not on a par使用(更老,更成熟)的Un * x端口(特别是Linux端口) )。

答案 2 :(得分:5)

我认为你的最佳选择仍然是PostgresSQL。花些时间确保您已正确调整应用程序。在您确信已经达到调整可以完成的限制后,开始缓存所有可能的内容。之后,开始考虑转移到异步主从设置...还在运行OLTP的同一数据库上运行OLAP类型功能吗?

答案 3 :(得分:5)

如果数据库设计真正优化的话,让我向您介绍几乎所有数据库服务器的最简单,最实用的方法:只需加倍你的ram 即可提升性能。这就像魔术。

答案 4 :(得分:3)

PostgreSQL比大多数扩展得更好,如果你打算继续使用关系数据库,Oracle就是这样。 ODBMS更好地扩展,但它们有自己的问题,因为它更接近于编程以设置一个 雅虎使用PostgreSQL,这应该告诉你一些可扩展性。

答案 5 :(得分:2)

如上所述,问题不在于您使用的特定数据库,即PostgreSQL,而是以下之一:

  • 架构设计,可能需要添加,删除,优化索引
  • 硬件也许你要求你的服务器很多 - 你说的是5k用户但是很少有人同时查询数据库
  • 查询:可能定义不清,导致效率低下

找出正在发生的事情的实用方法是分析PostgeSQL日志文件并找出以下方面的查询:

  • 最常执行
  • 运行时间最长
  • 等。等

快速审核会告诉您在哪里集中精力,您很可能会很快解决问题。没有灵丹妙药,你必须做一些功课,但与更改数据库供应商相比,这个功能会很小。

好消息...有很多实用程序可以让你的日志文件易于使用,并且易于解释结果,这里有两个:

pgFouine - a PostgreSQL log analyzer (PHP)

PQA (ruby)

答案 6 :(得分:1)

首先,我会确保优化确实有用。例如,如果您有许多索引,有时添加或修改记录可能需要很长时间。 我知道有几个大项目在PostgreSQL上运行,所以看看这个问题。

答案 7 :(得分:1)

我建议在这里查看有关PostgreSQL性能的信息:http://enfranchisedmind.com/blog/2006/11/04/postgres-for-the-win

你在运行什么版本的PG?随着版本的发展,性能也有了很大提升。

答案 8 :(得分:1)

您之前与我现在的公司有同样的问题。当我第一次加入他们时,他们的查询非常庞大且非常缓慢。运行它们需要10分钟。我能够将它们优化到几毫秒或1到2秒。在那段时间里我学到了很多东西,我将在其中分享一些亮点。

  1. 首先检查您的查询。进行所需的所有表的内部连接总是需要一段时间。我建议的一件事就是从表格开始,您可以将数据切换到您需要的数据。

    e.g。 SELECT * FROM(SELECT * FROM person WHERE person ilike'%abc')AS person;

  2. 如果您查看上面的示例,这会将您的结果剪切为您知道所需的内容,并且可以通过执行内部联接来进一步优化它们。这是加快查询速度的最佳方法之一,但有一种方法可以让猫皮肤变色。我无法在这里解释所有这些,因为有太多,但从上面的例子,你只需要修改它来满足你的需要。

    1. 这取决于你的postgres版本。较旧的postgres在内部优化查询。例如,在postgres 8.2及以下版本中,IN语句比8.4更慢。

    2. EXPLAIN ANALYZE是你的朋友。如果您的查询运行缓慢,请执行解释分析以确定哪一个导致缓慢。

    3. 吸尘您的数据库。这将确保数据库的统计信息几乎与实际结果相匹配。统计数据和实际情况的巨大差异将导致您的查询运行缓慢。

    4. 如果所有这些对您没有帮助,请尝试修改postgresql.conf。增加共享内存并尝试使用配置来更好地满足您的需求。

    5. 希望这会有所帮助,但当然,这些仅适用于postgres优化。

      顺便说一句。 5000个用户并不多。我的数据库包含大约20万到100万用户的用户。

答案 9 :(得分:0)

如果您确实希望从PostgreSQL切换,Sybase SQL Anywhere在TPC-C benchmark list的价格/性能方面排名第五。它也是前10名列表中最低价格的选项(到目前为止),并且是唯一的非Microsoft和非Oracle条目。

它可以轻松扩展到数千个用户和数TB的数据。

完全披露:我在SQL Anywhere开发团队工作。

答案 10 :(得分:0)

我们需要更多详细信息:您使用的是哪个版本?服务器的内存使用情况是多少?你在吸尘数据库吗?您的性能问题可能与PostgreSQL无关。

答案 11 :(得分:0)

如果你有多次写入读取,你可能想尝试MySQL,假设问题出在Postgres上,但你的问题是写入问题。

但是,您可能希望查看数据库设计,并可能考虑进行分片。对于一个非常大的数据库,您可能仍然需要查看上述两个问题。

您可能还希望查看非RDBMS数据库服务器或面向Mensia和CouchDB的文档,具体取决于手头的任务。没有一个工具可以管理所有任务,所以明智地选择。

出于好奇,您是否有任何可能导致此延迟的存储过程?