功能要求
我们有点为设备工作。粗略地说,每个设备都有其唯一标识符,IP地址和类型。
我有一个例程,ping所有具有IP地址的设备。 此例程只不过是一个C#控制台应用程序,它每3分钟运行一次,试图ping每个设备的IP地址。 ping的结果我需要存储在数据库中,以及验证日期(无论ping的结果如何)。
然后我们进入了技术方面。
技术部分:
假设我的ping和银行结构流程从2016年6月1日开始准备就绪,我需要做两件事:
两者都应该返回相同的东西:
理解为无法使设备被ping并且没有响应。 通过可用设备进行理解,可以成功进行ping和回答。
我今天拥有的并且非常糟糕:
具有以下结构的表:
create table history (id_device number, response number, date date);
此表有大量数据(现在有6000万,但趋势总是成倍增长)
**以下是问题:**
答案 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现在是一个逻辑对象,但实际上它是相互堆叠的相同表的集合。 由于每个分区数据都是单独存储的,因此当查询要求一天的数据时,只需要扫描一个分区。