【问题标题】:How to make arbitrary SQL-queries very quick from a huge table in the database如何从数据库中的巨大表中快速进行任意 SQL 查询
【发布时间】:2013-07-18 10:16:15
【问题描述】:

在 Oracle 11g DBMS 上,我们有一个包含约 5000 万条数据记录和约 100 列的单一平面表。主要出于性能原因制作了一个表。

有多个客户端应用程序对该表执行不同的选择 SQL 查询,此外它们可以异步侦听来自该表的更新。

问题:

主要问题 - 一些 sql 查询的工作非常缓慢 - 最多 8 分钟,确切地说。问题是 SQL 查询可以是任意的,这取决于客户端。 Oracle-hints 不是解决方案。此外,在某些情况下,Oracle 优化器会做出错误的估计或数据库索引会降低性能。关系数据库在这里很烂。

要求:

  1. 查询必须基于标准 SQL。
  2. 显着提高了从该表执行几乎所有选择查询的速度。
  3. 解决方案必须在客户端和数据数量方面具有可扩展性。
  4. 解决方案应该简单且经济高效。

问题:

您推荐哪些解决方案/架构来实现上述要求? 我们可能会考虑不同的非关系型数据库或内存缓存,开发我们自己的解决方案等等。

【问题讨论】:

  • 还会更新吗?我的意思是经常?
  • 是的,更新很频繁。更新的峰值数量是在一天结束时 = 每秒最多 500 条新记录。平均更新次数约为 100 次更新/秒。
  • 如果你有一个单一的平面表每秒有 100 次更新,使用 mysql,不要使用 oracle。因为在这种情况下您不需要关系数据库。
  • 我们在谈论什么样的MySql?还有一个关系 MySql DBMS。

标签: sql performance scalability database database-table


【解决方案1】:

如果您使用的是单个表格,它应该只用于报告,否则您做错了。报告数据不应该经常更新,而不是每小时更新一次。 如果 oracle 提示失败,您可以手动更改它,有时会发生,但这主要是因为更新/插入。 并且了解你的查询,不要盲目地为每一列创建索引(你确实使用正确的索引),检查这些慢查询花费时间的地方然后你就会知道在哪里优化。

如果您知道如何使用关系数据库,它们不会很糟糕。

【讨论】:

  • 不,这不是为了报告。我们真正需要的是持久化传入的新数据并向下游客户端发送实时更新。在这里更改提示不是解决方案,因为查询是动态的。提示最适合具体的 sql 查询。
  • 是的,当具体的执行计划出错时,提示会有所帮助,因为 oracle 预测错误(主要是因为经常更新)。您可以选择几个长查询并查看它们在哪里等待 - 磁盘、锁等。但是使用单个表在客户端之间交换大量数据听起来有点错误。
  • 感谢 Dainius 的回答。客户端之间不交换数据。他们只是编写 sql-query 并订阅传入该表的更新。
  • 我还想指出,由于读取数据时更新缓慢,我们根本不使用该表的索引。
  • 通过交换我并不是说一个人将数据发送到另一个槽数据库。有人将数据放入数据库,另一个读取。但是当您对单个表进行多次写入(尤其是更新)时,读取过程将花费大量时间等待,此时它可以读取数据。在这种情况下,我可能会尝试使用将数据保存在内存中的服务(传入的更改请求使内存中的数据无效)并且数据库数据大多只写入(可能在单独的线程中)并且仅在需要开始新读取时读取数据节点(写入过程需要将数据传递到每个读取节点)。
猜你喜欢
  • 2015-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多