【发布时间】:2012-03-06 07:45:18
【问题描述】:
我按间隔(gps 位置)存储数据,我不希望数据库膨胀,所以我定义了它可以达到的最大行数,然后每次插入时它都会删除最旧的行新的。
现在一位数据库专家查看了我的代码,他说这种方式效率不高,因为从数据库中删除一行是最耗费时间/内存/过程的操作,我应该不惜一切代价避免它。
他说我应该改为在达到 MAX 后遍历最旧的行(更新)。 (所以每次都是从上到下)
这意味着我需要保存一个单独的“标题”表以将当前指针保存到最旧的行并在每次插入时更新它(如果应用程序崩溃,我不想丢失它).. 它真的更有效率吗?还有其他更有效的方法吗?
【问题讨论】:
-
与其在插入时删除/更新,为什么不按设定的时间间隔和/或在某些条件下运行作业以删除最旧的行?因此,如果您的任意最大值当前为 1,000,000 行,为什么不设置一个作业以在计数 >= 1,100,000 时删除最旧的 100,000 行?
-
@gangreen 这是一个比我原来的(我已经考虑过的)更好的实现,但它仍然与数据库专家所说的相矛盾,即它的删除本身效率不高 - 不是我的大量操作preform 所以在他看来,删除 100,000 个仍然更昂贵,然后保存一个指针并每次更新最旧的一个..
-
我不确定我是否会称自己为专家,但我认为您的专家是错误的。插入不需要使用
WHERE子句来查找您需要的行,然后对其进行更新。如果您的更新不需要更新任何索引,那可能比需要它的插入便宜。如果您的应用程序收到大量新数据,我认为运行单个删除语句并附加 100,000 条记录会更便宜,如果它不经常接收数据,您可能可以通过更新每一行 - 底线,您可能应该设置性能限制,然后进行一些基准测试。
标签: android sql performance sqlite