问题描述
我正在从第三方来源获取具有20K行的表中的数据,在该数据源中,无法更改表的填充方式。
在第三方上,表格填写如下
- 每隔15秒大约有7K行新数据就会出现。
- 在任何给定时间,只有最后三个时间戳可用,其余数据将被删除。
- 表上没有索引。由于不可避免的原因,都无法请求该请求,并且插入过程可能很慢。
我知道以下情况
- 行锁以及在层次结构中在插入数据时将采用其他锁。
- 使用无锁选择仍然存在问题。
- 在临时表中将数据放在本地的情况下,因为我们正在联接表,所以在进行提取时不存在与任何其他表的联接。
- 当第三方停止数据插入时,数据将在100毫秒至122毫秒内到达。
- 开启服务需要3到5秒钟。
任何帮助/建议/方法都应事先得到赞赏。
解决方法
以下是一个相当高端的解决方案。根据您所说的,我相信它会起作用,但是有很多细节需要解决。
简而言之:表分区。
- 在此表上设置分区方案
- 根据我最近读过的article,可以使用未索引的堆完成此操作
- 每15秒加载一次数据吗?那么分区需要基于这15秒间隔
对于给定的数据负载(即每15秒一次):
- 创建“下一个”分区
- 加载数据
- 将新分区(新数据)切换到主表中
- 切换最旧的分区(一次仅显示三个时间段的数据,对吧?
- 删除“已退休”的分区
尽管可能高效有效,但这将非常混乱。我看到的最大问题是,如果他们不能添加简单的索引,我看不到他们如何设置表分区。
另一个类似的技巧是设置分区视图,本质上是“滚动自己的分区”。就像这样:
- 具有一组结构相同的表
- 创建视图UNION ALLing表
- 在数据加载时,创建一个新表,将数据加载到该表中,然后通过ALTER VIEW包含该最新表并删除最旧的表。
与分区解决方案相比,这可能具有更严重的锁定/阻止问题,尽管这在很大程度上取决于读取活动的强度。而且,当然,它比仅添加索引要复杂得多。