【发布时间】:2018-11-26 02:35:41
【问题描述】:
我们有一个 Sybase ASE 简单表,只有一列,如下所示
Table Name: Items
+------------+
| itemId |
+------------+
| ABCDEFGH1 |
| ABCDEFGH2 |
+------------+
itemId is the primary key.
生产者会以不确定的速率使用数据填充此表。
我们有一个消费者(Java 进程)不断轮询这个表(使用 JDBC),通过这样做
SELECT TOP 5000 itemId FROM Items ORDER BY itemId desc
这些 itemId 将在成功处理后(例如每 200 毫秒)被消费者删除。 我们可以假设消费者总是比生产者快,这意味着表中的记录数很少会超过 5000。
我们不断进行轮询,因为我们希望尽快将更新发送给消费者,以模拟“推送”行为。
我的问题:
- 对这种方法的性能影响是什么。
- 为什么会影响这些性能,能否在理论上对其进行解释并在实践中进行验证(如果有人可以分享有关如何创建环境来验证这一点并评估结果的想法)
【问题讨论】:
-
我想这取决于您轮询的频率,因此您需要多长时间轮询消费者才能领先于生产者。
-
@TimBiegeleisen Sybase 是做什么的?由于使用“order by”对小表进行持续轮询,它会在内存缓存中放入任何内容吗?或者每次我在使用硬盘驱动器但 CPU 和内存消耗很少时?关于建立一个好的环境来测试这个有什么想法吗?或者这是因为使用的资源很少而几乎可以忽略的东西?
-
我不太了解 5000 行的固定轮询?如果生产者插入行直到某个点然后停止,然后在删除它们之前将它们拾取,那么生产者在单独的表中设置信号量/状态肯定会更好地允许它们之间进行一些交互而不是假设5k 行总是可以的?这使您能够执行“如果存在(从
中选择 1 ...执行某些操作”类型的 SQL,它将轮询该表中的任何内容,并大大减少数据库的工作量,而不是读取 5k 键跨度>
标签: java database performance sybase sap-ase