2016-05-24 239 views
0

功能需求最佳方式使用Oracle

我们有点对设备的工作创造巨大的数据表。粗略地说,每个设备都有其唯一的标识符,IP地址和类型。

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

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

技术部分:

假设我ping和银行的结构化方法是从2016年1月6日这一天准备好了,我需要做两件事情:

  • 每日提取
  • 提取实时(最近24小时)

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

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

理解为不可用的设备被ping并且没有响应。 通过可用设备了解并成功应答。

今天我有什么,很厉害的作品:

具有以下结构的表:

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

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

**这里有几个问题:**

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

我个人会使用2个表格。一个表格在日期(或月份)上进行分区以存储历史数据。而最近的记录则是一张较小的表格。然后通过自动脚本将数据从较小的表格移动到大表格。 – LukStorms

回答

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) > ?; 

如果缺少响应你写一个默认值,而不是空,您可以尝试构建它作为索引组织表。

您需要阅读有关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现在是一个逻辑对象,但实际上它是堆叠在一起的相同表格的集合。 由于每个分区数据都是分开存储的,因此当查询询问一天的数据时,只需要扫描一个分区。

+0

感谢您的回答!但是,通过划分表格,你的意思是什么?你的意思是根据月份创建N个其他表格?你能告诉我一个例子吗? –

+0

给你一个上面的例子,但你真的需要阅读有关分区 –

+0

我需要重新创建表吗?有没有办法将表格“拆分”成几个月? –