使用oracle为大数据创建表的最佳方法

时间:2016-05-24 14:25:54

标签: oracle database-performance

功能要求

我们有点为设备工作。粗略地说,每个设备都有其唯一标识符,IP地址和类型。

我有一个例程,ping所有具有IP地址的设备。 此例程只不过是一个C#控制台应用程序,它每3分钟运行一次,试图ping每个设备的IP地址。 ping的结果我需要存储在数据库中,以及验证日期(无论ping的结果如何)。

然后我们进入了技术方面。

技术部分:

假设我的ping和银行结构流程从2016年6月1日开始准备就绪,我需要做两件事:

  • 每日提取
  • 实时提取(过去24小时)

两者都应该返回相同的东西:

  • 超过24小时不可用的设备。
  • 超过7天不可用的设备。

理解为无法使设备被ping并且没有响应。 通过可用设备进行理解,可以成功进行ping和回答。

我今天拥有的并且非常糟糕:

具有以下结构的表:

create table history (id_device number, response number, date date);

此表有大量数据(现在有6000万,但趋势总是成倍增长)

**以下是问题:**

  • 如何在不遇到查询缓慢的问题的情况下实现这些目标?
  • 如何创建一个准备在我的公司世界中接收数百/数十亿条记录的表结构?

1 个答案:

答案 0 :(得分:1)

根据日期对表格进行分区。 对于分区策略,请考虑性能与维护。 为方便管理,请按月或按周使用自动INTERVAL分区。 您甚至可以在白天或手动预先定义2天的间隔。 您查询只需要2个日历日。

select id_device, 
       min(case when response is null then 'N' else 'Y' end), 
       max(case when response is not null then date end)
from history
where date > sysdate - 1
group by id_device
having min(case when response is null then 'N' else 'Y' end) = 'N'
   and sysdate - max(case when response is not null then date end) > ?;

如果缺少响应,则编写默认值而不是NULL,您可以尝试将其构建为索引组织表。

您需要阅读有关Oracle分区的信息。

此语句将创建按日历日分区的HISTORY表。

create table history (id_device number, response number, date date) 
  PARTITION BY RANGE (date) 
  INTERVAL(NUMTOYMINTERVAL(1, 'DAY'))
    ( PARTITION p0 VALUES LESS THAN (TO_DATE('5-24-2016', 'DD-MM-YYYY')),
      PARTITION p1 VALUES LESS THAN (TO_DATE('5-25-2016', 'DD-MM-YYYY'));

所有旧数据都将在P0分区中。 从2016年5月24日开始,每天将自动创建一个新分区。 HISTORY现在是一个逻辑对象,但实际上它是相互堆叠的相同表的集合。 由于每个分区数据都是单独存储的,因此当查询要求一天的数据时,只需要扫描一个分区。