【问题标题】:How to manage a large table with lots of inserts and selects?如何管理具有大量插入和选择的大表?
【发布时间】:2012-10-05 11:49:16
【问题描述】:

我有一个表 X,它有大约 64 列存储在线金融交易。 每天有数百万条记录被插入到 X 中。大约有 16 列 X 是可查询的,也就是说很多系统报表需要根据这 16 列的值来过滤 X 的数据。

为所有这 16 列设置数据库索引会使插入操作太慢。另一方面,在某些列上没有索引也会使某些报告太慢。

那么,问题来了。我如何设计表 X 及其索引以获得最佳的插入和报告性能?我使用 oracle 11g DBMS。

【问题讨论】:

  • 您需要实时报告,还是 x 小时/天前的结果令人满意?
  • 如果除了延迟数小时/天的报告没有其他解决方案,我不得不接受,但最好是在线报告。
  • 为什么这个表有64列?我的直觉是这张表太宽了,其中一些数据应该分布在更多的表中。
  • 如果您告诉我们表的结构(包括当前索引),也许我们可以提供帮助。
  • @Colin'tHart:关于这64个属性属于一个实体,即交易(交易日期、时间、金额、银行、卡号、账号等),不是明智的做法是将它们分布在不同的表中。

标签: sql database oracle indexing


【解决方案1】:

尝试对表进行分区。与其创建一个巨大的表,不如每天、每周或每月创建一个,并创建一个将所有这些表连接起来以进行查询的视图。或者,Oracle 支持分区表(但是否可用取决于您的 Oracle 版本)。

插入数据时,插入正确的分区。这样,要更新的索引会小得多。缺点是索引需要更多空间,因为索引值会重复。

从积极的方面来说,查询可能会更快,因为数据库可以在不同磁盘上并行读取表。

另请注意,SQL 数据库不会扩展到任意大小。请考虑使用集群或云数据库。它们还有其他缺点,但它们可以处理任意数量的记录(只要您有足够的物理空间供服务器使用)。

【讨论】:

  • SQL 数据库没有理由不能扩展到每天数百万次插入。什么是“云数据库”?
  • 主要原因是插入或查询数据的时间随着您添加数据而增加。最终,对数据库的任何操作都将花费太长时间。是的,“云数据库”一词并不准确。 “支持 map-reduce 的数据存储”会更好吗?
  • map-reduce 能力是一个好词。但我不同意意见。一个设计良好的 SQL 数据库可以扩展得远远超出我们大多数人的想象。
  • @AaronDigulla:很好的评论亚伦。比X。
【解决方案2】:

建议:

  1. 如果可能,尝试规范化表格。
  2. 如果不存在则创建聚集索引。 (INT64 会在你的情况下)
  3. 如果索引列的大小很大并且遵循某种模式,请尝试将不同的数据移动到单独的查找表并替换为代理键引用,这将减少索引大小。
  4. 使用多个键创建索引。 (减少索引数量)
  5. 对表进行分区,因为一年内您将获得大约 3.6 亿条记录。

【讨论】:

    猜你喜欢
    • 2021-11-06
    • 1970-01-01
    • 2021-05-31
    • 2018-04-22
    • 2018-04-24
    • 2011-11-10
    • 2018-04-15
    • 2013-06-16
    • 1970-01-01
    相关资源
    最近更新 更多